UTF-8、GB2312、GBK编码格式详解和编码示例

时间:2024-01-23 20:59:52

UTF-8、GB2312、GBK编码格式详解

参考文章

UTF-8

使用1~4个字节对每个字符进行编码

  • 128个ASCII字符字需要一个字节编码
  • 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节进行编码
  • 其他基本多文种平面中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码
  • 其他极少使用的Unicode辅助平面的字符使用四至六字节编码

GB2312,GBK编码

  • GB2312:一个小于127的字符意义与原来的相同,但是两个大于127的字符连在一起时,就表示一个汉字;前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE;其中,在ASCII里本来就有个的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符
  • GBK:不再要求低字节一定是127号之后的编码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容

例子

以下例子使用nodeJS来编写,具体代码和相关测试文件可见Github

联通

参考文章中给出了一个比较经典的例子,在这里详细研究一下。

------------------非UTF-8编码保存的[联通]数据------------------

<Buffer c1 aa cd a8>

------------------UTF-8编码保存的[联通]数据-带BOM------------------

<Buffer ef bb bf e8 81 94 e9 80 9a>

------------------UTF-8编码保存的[联通]数据-不带BOM------------------

<Buffer e8 81 94 e9 80 9a>
  • 可以清楚看到window默认编码格式GB2312和UTF-8编码格式的区别:GB2312使用两个字节对汉字进行编码,而UTF-8使用三个字节对汉字进行编码
  • UTF-8带BOM的编码格式和不带BOM的编码格式之间的区别:BOM格式会在头部添加ef bb bf三个字节作为标志

中英文混合

这个主要是看各个编码格式对于ASCII编码的兼容情况

------------------非UTF-8编码保存的[hello 你好]数据------------------
<Buffer 68 65 6c 6c 6f 20 c4 e3 ba c3>
------------------UTF-8编码保存的[hello 你好]数据-带BOM------------------
<Buffer ef bb bf 68 65 6c 6c 6f 20 e4 bd a0 e5 a5 bd>
------------------UTF-8编码保存的[hello 你好]数据-不带BOM------------------
<Buffer 68 65 6c 6c 6f 20 e4 bd a0 e5 a5 bd>
  • 可以看出,两种编码格式对ASCII都能兼容,前面的[hello ]两者的编码是一致的,而中文字符编码则是根据各自不同的编码规则来得
  • 如果只有ASCII字符,则两种编码是等价的,GB2312方式打开UTF-8编码的文件不会出现乱码,反之亦然

编码格式区分

  • 带有BOM信息的,可以根据BOM信息进行区分:前三个字节为:ef bb bf的是UTF-8编码格式
  • 没有BOM信息的,则需要按字节进行区分:如果UTF-8中有中文字符,则可以根据1110XXXX 10XXXXXX 10XXXXXX这种格式来进行区分;如果UTF-8中有其他两个字节编码的字符则较难进行区分,希望有人可以给指点