常用编码的编码范围

刚整理出来的,常用编码的编码范围

注:
1、0x00-0x7f这样的是指这样一个整数区间[0x00,0x7f],其中包含0x00和0x7f
2、C语言规定,任何时候,凡是读到0x0,就意味着字符串结束

gb2312:

字长为1字节-2字节
0x00-0x7f
0xA1-0xFE,0xA1-0xFE

gbk:

字长为1字节-2字节
0x00-0x7F
0x80-0xFE,0x40-0xFE

gb18030: (18030-2000)

字长为1字节-4字节
0x00-0x7f
0x81-0xfe,0x40-0x7E或0x80-0xFE
0x81-0xfe,0x30-0x39,0x81-0xFE,0x30-0x39

big5:

字长为1字节-2字节
0x00 - 0x7F
0xA1 - 0xFE,0x40-0xFE

utf-8:

字长为1字节-6字节:
0x00-0x7F
0xC0-0xDF,0x80-BF
0xE0-0xEF,0x80-BF,0x80-BF
0xF0-0xF7,0x80-BF,0x80-BF,0x80-BF
0xF8-0xFB,0x80-BF,0x80-BF,0x80-BF,0x80-BF,
0xFC-0xFD,0x80-BF,0x80-BF,0x80-BF,0x80-BF,0x80-BF

特征:

每个字的第一个字节(开始字节)必定不以10开头,开始字节之后的字节必定以10开头。
如果某个字节高两位为10,则说明这个字节不是开始字节。
容错能力好,解析的过程中发现某个字节不正确,则跳过这个字,继续解析后面的字符就好。

确定字长的方法:

每个开始字节从高位向低位寻找第一个0。如果0在从高向低数的第i位,则此字的长度为
i+1个字节。

用于检测字符串是否utf-8的perl正则:
http://www.w3.org/International/questions/qa-forms-utf-8.en.php

$field =~
  m/^(
     [\09\0A\0D\x20-\x7E]               # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*$/x;

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥