判断字符串是否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; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断字符串是否为UTF-8编码,需要检查字符串的字节序列是否满足UTF-8编码规则。UTF-8编码规定了字符编码方式与字节序列的对应关系。 UTF-8编码使用1至4个字节来表示不同的Unicode字符,其编码规则如下: - 单字节编码:对于Unicode码范围在U+0000至U+007F之间的字符,其UTF-8编码为一个字节,范围为0x00至0x7F(十六进制)。 - 多字节编码:对于Unicode码范围在U+0080至U+FFFF之间的字符,其UTF-8编码使用2至4个字节,其每个字节的最高两位分别为1和0,后面的字节均以10开头。 根据上述规则,我们可以逐字节地检查字符串的字节序列。如果满足上述的字节编码规则,则认为字符串是UTF-8编码。如果不满足规则,则可以判断字符串不是UTF-8编码。 以下是一个简单的示例代码: ```python def is_utf8(string): bytes = string.encode('utf-8') length = len(bytes) i = 0 while i < length: if (bytes[i] & 0b10000000) == 0: # 单字节编码 i += 1 elif (bytes[i] & 0b11100000) == 0b11000000: # 2字节编码 if i + 1 < length and (bytes[i + 1] & 0b11000000) == 0b10000000: i += 2 else: return False elif (bytes[i] & 0b11110000) == 0b11100000: # 3字节编码 if i + 2 < length and (bytes[i + 1] & 0b11000000) == 0b10000000 and (bytes[i + 2] & 0b11000000) == 0b10000000: i += 3 else: return False elif (bytes[i] & 0b11111000) == 0b11110000: # 4字节编码 if i + 3 < length and (bytes[i + 1] & 0b11000000) == 0b10000000 and (bytes[i + 2] & 0b11000000) == 0b10000000 and (bytes[i + 3] & 0b11000000) == 0b10000000: i += 4 else: return False else: return False return True string = "测试UTF-8" result = is_utf8(string) print(result) # 输出:True ``` 以上代码逐字节检查了`string`字符串的字节序列,并判断是否满足UTF-8编码规则。如果输出结果为True,则表示字符串是UTF-8编码,反之则不是。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值