文本文件编码方式的简单识别

来源:互联网 发布:用ant执行sql 语句 编辑:程序博客网 时间:2024/06/10 00:23
 在实际编程中经常会碰到需要读取一个文本文件的内容并将其显示到程序中的情况。如果文件中所有的内容都以ASCII方式编码固然简单(通常包含英文字母和数字的文件,比如readme之类),但遇到包含其他语言字符,如中文和日文之类就必须在显示之前知道其编码方式。这是因为很多程序在显示文本内容时只接受UNICODE,故我们必须对非UNICODE的编码方式进行转换。由于谈到UNICODE时通常讨论的都是UCS-2,文中将只对UCS-2文件进行分析。

本文提供了针对UCS-2 Little Endian,UTF-8和GB2312三种方式的文本文件进行编码识别的方法:

1. UCS-2文件

UCS-2 Little Endia文件以FF FE开头,所以如果一个文件以该标志开头,可以判断出其为UCS-2 Little Endian编码。类似的,UCS-2 Big Endia文件以FE FF开头。当读取UCS-2编码的大文件时,如果因为内存限制而无法一次性将所有内容都读出来的话,就需要分批读取。由于UCS-2是长度固定的编码方式(两个字节表示一个UNICODE字符),因此只要保证每次都采用偶数长度的缓冲区进行读取,转换就不会出现乱码。

2. UTF-8文件

标准UTF-8编码的文件是以EF BB BF开头,如果读到该标志,则可以以UTF-8方式进行UCS-2的转码。但是当程序读取部分内容进行编码的时候则与UCS-2方式有很大的不同!根据规范,采用UTF-8方式进行编码的字符可以有从1到6个字节的不等长度。因此程序必须从缓冲区末尾开始判断最后一个UTF-8字符出现的位置,以防出现只包含字符的部分内容从而导致转码失败。

UTF-8的编码规则如下表所示:

UCS-2取值范围UTF-8编码格式
0x00000000 -  0x0000007F0xxxxxxx0x00000080 -  0x000007FF110xxxxx 10xxxxxx    0x00000800 -  0x0000FFFF        1110xxxx 10xxxxxx 10xxxxxx    0x00010000 -  0x001FFFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx0x00200000 -  0x03FFFFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx0x04000000 -  0x7FFFFFFF1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
因此逆向查找必须找到以下信息以确定UTF-8字符的开始字节:
  • ASCII兼容的字符。这种字符的UTF-8编码值小于0x7F
  • 非ASCII字符的UTF-8编码中的第一个字符总是在范围0xC0到0xFD。如果找到此范围内的字符,则可以确定一个UTF-8字符的开始。另外第一个编码的字节中1的个数指定了该字符总共的字节数。
这样就可以确定缓冲区的结尾是否包含了一个完整的UTF-8字符。如果只是部分包含,则应该将该字符去除,否则转换出的结果会有乱码。

3. GB2312文件

GB2312为简体中文汉字的编码方式,在网络上很常见。GB2312编码的字符可以有一个或两个字节。其中和ASCII兼容的部分都占用一个字节。每个汉字由两个汉字表示。GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。由于使用GB2312编码的文件不像UCS-2或UTF-8一样使用特殊的标志,因此很难判断其编码方式。当然也可以采取猜测的方式,例如对于非ASCII的双字节字符,其第一个字符处于0xA1到0x7E的范围之内。但这种方式并不保险,容易和其他编码方式冲突。

总之,对于不同编码方式的文件,除非有特殊的标志可以标示,否则只能采用猜测之类的办法,并且不能保证每次成功。估计只有等到未来UNICODE能够一统天下的时候才不会再有这些问题。:)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 幼儿老师遇到家长比较孩子该怎么办 发的微信公众号内容重复了怎么办 招嫖诈骗微信转账被骗怎么办 朋友在深圳龙岗被传销骗了要怎么办 怀疑家里人被传销组织骗去了怎么办 怀疑家人被骗进传销了该怎么办 b本扣3分了怎么办2018 抖音里面就剩人头的视频怎么办 自学参加普通高考那小高考怎么办 如果小学生长胸只长了一个该怎么办 脸上毛多导致的毛孔粗怎么办 吃了激素药头发掉的厉害怎么办 剪发的剪子中间的螺丝扣总掉怎么办 染完头发后一段时间长新头发怎么办 睡觉头发老被老公压着怎么办 漆盖关节不自在怎么办?吃什么好 摆床头的位置后面是弧形位怎么办 君子兰的根全烂掉了只剩茎怎么办 老板不发工资怎么办 没签合同的 牙套粘在牙齿上的松了怎么办 缝的线长在肉里怎么办 小孩喜欢用舌头顶牙齿缝怎么办 1岁多小宝贝全身长红点怎么办 生完胸好涨但很难把奶吸出来怎么办 怀孕快9个月内裤上有白带怎么办 一早起来发现内裤有白色液体怎么办 阴部骚痒白带多白带多小腹痛怎么办 15岁一周鲁了3次怎么办 月经摊迟三天内裤有白带怎么办 怀孕内裤上有黄黄的分泌物怎么办 老公出轨想离婚但舍不得孩子怎么办 老婆出轨离婚又舍不得家我该怎么办 怀孕一个月刚刚自慰有点流血怎么办 老公出轨还不知道悔改妻子怎么办 离婚了前妻户口还在再婚怎么办 怀孕六个月内裤老是湿有异味怎么办 怀孕五个月内裤总是湿有异味怎么办 耳朵里面有个洞老是流水冒浓怎么办 宝宝拉粑粑有臭酸味怎么回事怎么办 老婆晚上回家内裤是湿的尿味怎么办 怀孕五个月下身痒内裤湿怎么办