文本文件的编码识别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

⽂本⽂件的编码识别
⽂本⽂件的编码识别
⽂本⽂件的编码问题,困扰我很久,在跨平台、源程序中的中⽂字符、从⽂本⽂件中读取中⽂字符的时候,若对⽂件编码问题没有弄清楚,难免会⾛弯路。

对此情况,我准备针对⼏个主题,记录下⾃⼰学习的⼼得,以备⽇后查阅和分享。

认识⽂本⽂件
⽂件分为两种类型:⽂本⽂件和⼆进制⽂件;
⽂件⽂件:是以字符编码的⽅式进⾏保存的;每⼀⾏都以换⾏符结束(由于历史原因,各操作系统的换⾏符不⼀样,Windows的是"<回车><换⾏>",即"\r\n",Unix/Linux的是"<换⾏>",即"\n",Mac的是"回车",即"\r");在⽂件最后⼀⾏的结尾有⽂件结束标志EOF,它的值也依赖于系统,⼀般为-1。

⼆进制⽂件:是将内存中数据原封不动的读取和写⼊⽂件中。

字符编码
⼀般常见的编码格式有:ASCII、UTF-8、UTF-16、GB2312、Big5、GBK、GB18030。

详细的字符编码知识,此处不再多说。

需要知道的事:
在Windows的语境中,所谓的[ANSI]指的是对应当前系统 locale 的遗留(legacy)编码。

在Windows的语境中,所谓的[Unicode]指的是带有 BOM 的⼩端序 UTF-16。

在Windows的语境中,所谓的[UTF-8]指的是带 BOM 的 UTF-8。

⽂件编码的模式识别
知道了字符编码的细节,还不⾜以正确处理我们所⾯对的种类繁多的⽂本⽂件。

⾸先,我们看看各编码格式的⽂件存储格式。

BOM:要识别UTF-8和UTF-16就不得不说到字节顺序标记(byte-order mark,BOM),它⽤来标识该字节流的字节序,是⾼位在前还是低位在前。

从Unicode3.2开始,BOM只能位于流的开头,只能⽤于标识字节序。

UTF-16中,字节顺序标记被放置为⽂件或字符串流的第⼀个字符,以标⽰在此⽂件或字符串流中,以所有⼗六⽐特为单位的字码的尾序(字节顺序)。

* 如果⼗六⽐特单位被表⽰成⼤尾序,这字节顺序标记字符在串⾏中将呈现0xFE,其后跟着0xFF(其中的0x⽤来标⽰⼗六进制)。

* 如果⼗六⽐特单位使⽤⼩尾序,这个字节串⾏为0xFF,其后接着0xFE。

UTF-8则没有字节顺序的议题。

UTF-8编码过的字节顺序标记则被⽤来标⽰它是UTF-8的⽂件。

它只⽤来标⽰⼀个UTF-8的⽂
件,⽽不⽤来说明字节顺序。

许多Windows程序(如记事本)会添加字节顺序标记到UTF-8⽂件。

然⽽,在类Unix系统(⼤量使⽤⽂本⽂件,⽤于⽂件格式,⽤于进程间通信)中,这种作法则不被建议采⽤。

故,UTF-8分为UTF-8有BOM格式和UTF-8⽆BOM格式。

UTF-8: 若为UTF-8有BOM格式,则⽂件开头为 EF BB BF;若为UTF-8⽆BOM格式,则不能依据上述规则;此时需要依据UTF-8编码格式来判断,其编码如下:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-16: 若为UTF-16(⼤端序),则⽂件开头为 FE FF; 若为UTF-16(⼩端序),则⽂件开头为 FF FE;
GB2312: GB2312中对所收汉字进⾏了"分区"处理,每区含有94个汉字/符号。

这种表⽰⽅式也称为区位码。

01-09区为特殊符号。

16-55区为⼀级汉字,按拼⾳排序。

56-87区为⼆级汉字,按部⾸/笔画排序。

在使⽤GB2312的程序通常采⽤EUC储存⽅法,以便兼容于ASCII.
ASCII字符,范围为0x20-0x7E,直接⽤单字节表⽰。

每个汉字及符号以两个字节来表⽰。

第⼀个字节称为"⾼位字节",第⼆个字节称为"低位字节"。

"⾼位字节"使⽤了0xA1-0xF7(把01-87区的区号加上0xA0),"低位字节"使⽤了0xA1-0xFE(把01-94加上0xA0)。

Big5: Big5码是⼀套双字节字符集,使⽤了双⼋码存储⽅法,以两个字节来安放⼀个字。

第⼀个字节称为"⾼位字节",第⼆个字节称为"低位字节"。

"⾼位字节"使⽤了0x80-0xFE,"低位字节"使⽤了0x40-0x7E,及0xA1-0xFE。

因Big5相对使⽤较少,此处不做识别。

GBK: 字符有⼀字节和双字节编码,00–7F范围内是⼀位,和ASCII保持⼀致,此范围内严格上说有96个⽂字和32个控制符号。

之后的双字节中,前⼀字节是双字节的第⼀位。

总体上说第⼀字节的范围是81–FE(也就是不含80和FF),第⼆字节的⼀部分领域在40–7E,其他领域在80–FE.
GB18030: 标准采⽤单字节、双字节和四字节三种⽅式对字符编码。

使⽤0×00⾄0×7F码位(对应于ASCII码的相应码位)。

双字节部分,⾸字节码位从0×81⾄0×FE,尾字节码位分别是0×40⾄0×7E和0×80⾄0×FE。

四字节部分采⽤GB/T 11383未采⽤的0×30到0×39作为对双字节编码扩充的后缀,这样扩充的四字节编码,其范围为0×81308130到0×FE39FE39。

其中第⼀、三个字节编码码位均为0×81⾄0×FE,第⼆、四个字节编码码位均为0×30⾄0×39。

⾯向字节的模式识别
UTF-16 直接根据其BOM识别;
UTF-8 ⾸先根据BOM识别,若不符,再以上述编码规则识别;
GB2321、GB18030 因GB18030完全兼容GB2321,则只识别GB18030,根据如下规则识别:
单字节: 0到0x7F 0000.0000-0111.1111 双字节: 第⼀个字节的值从0x81到0xFE,第⼆个字节的值从0x40到0xFE(不包括0x7F) 1000.0001-1111.1110 0100.0000-1111.1110 四字节,第⼀个字节的值从0x81到0xFE,第⼆个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39 1000.0001-1111.1110 0011.0000-0011.10001 1000.0001-1111.1110
0011.0000-0011.10001
PS:个⼈新⼲博客地址。

相关文档
最新文档