判断字符串是否UTF8编码

 UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
  编码原理
  先看这个模板:
  UCS-4 range (hex.) UTF-8 octet sequence (binary)
  0000 0000-0000 007F 0xxxxxxx
  0000 0080-0000 07FF 110xxxxx 10xxxxxx
  0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
  0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx
  编码步骤:
  1) 首先确定需要多少个8bits(octets)
  2) 按照上述模板填充每个octets的高位bits

  3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x

 

 根据UTF8编码,最多可由6个字节组成,所以UTF8是1-6字节编码组成

 

C++代码如下:

  1. int IsTextUTF8(char* str,ULONGLONG length) 
  2.     int i; 
  3.     DWORD nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节
  4.     UCHAR chr; 
  5.     BOOL bAllAscii=TRUE;  //如果全部都是ASCII,  说明不是UTF-8
  6.     for(i=0;i<length;i++)
  7.     { 
  8.         chr=   *(str+i); 
  9.         if(   (chr&0x80)   !=   0   )   // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
  10.             bAllAscii=   FALSE; 
  11.         if(nBytes==0)     //如果不是ASCII码,应该是多字节符,计算字节数
  12.         { 
  13.             if(chr>=0x80)  
  14.             {
  15.                 if(chr>=0xFC&&chr<=0xFD)
  16.                     nBytes=6;
  17.                 else if(chr>=0xF8)
  18.                     nBytes=5;
  19.                 else if(chr>=0xF0)
  20.                     nBytes=4;
  21.                 else if(chr>=0xE0)
  22.                     nBytes=3;
  23.                 else if(chr>=0xC0)
  24.                     nBytes=2;
  25.                 else
  26.                 {
  27.                     return FALSE;
  28.                 }
  29.                 nBytes--;
  30.             }
  31.         } 
  32.         else  //多字节符的非首字节,应为 10xxxxxx 
  33.         { 
  34.             if(   (chr&0xC0)   !=   0x80   )   
  35.             { 
  36.                 
  37.                 return   FALSE; 
  38.             } 
  39.             nBytes--;                                                       
  40.         } 
  41.     } 
  42.     if(   nBytes   >   0   ) //违返规则
  43.     {      
  44.         return   FALSE; 
  45.     } 
  46.     if(   bAllAscii   ) //如果全部都是ASCII,  说明不是UTF-8
  47.     {          
  48.         return   FALSE; 
  49.     } 
  50.     return   TRUE; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值