研究字符编码的时候不要用UltraEdit32
2009-09-17 15:15
239 查看
当时学编程的时候没有太注意字符编码的事情,后来随着工作中不断地接触,才认真地去研究了解了一下。当时最有名的问题就是说在记事本里边敲入“联通”,然后再打开就成乱码了,敲入“移动”则不变,然后得出惊世骇俗的结论:移动比联通强,呵呵。关于编码的问题,在这里不多说了,不清楚可以去google上百度一下。我只简单的重提一下。
主要是因为notepad这个程序作为一个小工具,识别编码的功能不方便做大。当文档中所有字符都在C0≤AA≤DF 80≤BB≤BF这个范围的时候,notepad都无法确认文档的格式,没有自动按照UTF-8格式来"Display"
。"联通"就是C1 AA CD A8,刚好在上面的范围内,所以不能正常显示
[转自网上]
。
其中提到如果用ASCII方式打开txt文件,就是正常的了。或者用UTF-8方式保存
。用UTF-8保存则以EF BB BF打头的,然后中文字节将以三个字节编码一个汉字。若以Unicode编码,则以FF FE打头,中文字节还以2个字节编码一个汉字。
我写了好几个有着“联通”字符的文本,分别保存为Ansi,UTF-8,Unicode形式,然后在UtraEdit中查看,转成Hex形式,结果发现分别表示为
Ansi:FF FE 6A 00 68 03
UTF-8:FF FE C1 AA CD A8
Unicode:FF FE
C1 AA CD A8
除了最后一个对外,其他两个都有问题,第一个按理没有FF FE,后面更加不对,应该就四个字节,是这个汉字的GB码才对啊,第二个UTF-8跟第三个不一样了么。没有按以上理论来啊,我怎么也没怀疑到UE上,还怀疑编码是不是有什么规则转换的。将
Ansi的文件字节删去了FF FE,用Ansi的方式打开,发现只剩下一个“通”字了,用UE再看一下,发现剩下的是“FF FE 68 03”,反而将第三,四个字节删了。怪了,右击文件属性显示2个字节。于是调出我的终极武器winhex,他的显示分别为:
Ansi:C1 AA CD A8
UTF-8:EF BB BF E8 81 94 E9 80 9A
Unicode:FF FE
C1 AA CD A8
和传说中的字符编码理论描述是一致的。
UtraEdit他是优先识别文本,然而识别编码的功夫又是这么差劲,还停留在记事本的初级阶段。这样也就不说他了,但用Hex查看的时候,显示的又是当前文本中unicode编码二进制表示,不是文件本身的字节表示,所以才有以上的结果。那个Ansi码文件的显示是因为不能识别,默认unicode编码,显示的是当前乱码的unicode编码字节。真是害人不浅哪,枉我信任他这么多年。所以呢,还是要用怀疑的态度去研究问题,不要迷信软件。
主要是因为notepad这个程序作为一个小工具,识别编码的功能不方便做大。当文档中所有字符都在C0≤AA≤DF 80≤BB≤BF这个范围的时候,notepad都无法确认文档的格式,没有自动按照UTF-8格式来"Display"
。"联通"就是C1 AA CD A8,刚好在上面的范围内,所以不能正常显示
[转自网上]
。
其中提到如果用ASCII方式打开txt文件,就是正常的了。或者用UTF-8方式保存
。用UTF-8保存则以EF BB BF打头的,然后中文字节将以三个字节编码一个汉字。若以Unicode编码,则以FF FE打头,中文字节还以2个字节编码一个汉字。
我写了好几个有着“联通”字符的文本,分别保存为Ansi,UTF-8,Unicode形式,然后在UtraEdit中查看,转成Hex形式,结果发现分别表示为
Ansi:FF FE 6A 00 68 03
UTF-8:FF FE C1 AA CD A8
Unicode:FF FE
C1 AA CD A8
除了最后一个对外,其他两个都有问题,第一个按理没有FF FE,后面更加不对,应该就四个字节,是这个汉字的GB码才对啊,第二个UTF-8跟第三个不一样了么。没有按以上理论来啊,我怎么也没怀疑到UE上,还怀疑编码是不是有什么规则转换的。将
Ansi的文件字节删去了FF FE,用Ansi的方式打开,发现只剩下一个“通”字了,用UE再看一下,发现剩下的是“FF FE 68 03”,反而将第三,四个字节删了。怪了,右击文件属性显示2个字节。于是调出我的终极武器winhex,他的显示分别为:
Ansi:C1 AA CD A8
UTF-8:EF BB BF E8 81 94 E9 80 9A
Unicode:FF FE
C1 AA CD A8
和传说中的字符编码理论描述是一致的。
UtraEdit他是优先识别文本,然而识别编码的功夫又是这么差劲,还停留在记事本的初级阶段。这样也就不说他了,但用Hex查看的时候,显示的又是当前文本中unicode编码二进制表示,不是文件本身的字节表示,所以才有以上的结果。那个Ansi码文件的显示是因为不能识别,默认unicode编码,显示的是当前乱码的unicode编码字节。真是害人不浅哪,枉我信任他这么多年。所以呢,还是要用怀疑的态度去研究问题,不要迷信软件。
相关文章推荐
- 技术研究的时候不要忘了“集成创新”
- c++ builder 中使用多线程的时候注意。不要试图去终止一个已经自动终止的线程
- 我的创意,有缘的都来拿去吧。(我用的时候请不要告我侵权)
- 最近研究Android,发现对于外部导入的工程,编译的时候不能够正常生成R.java文件的解决办法
- 不要着急,最好的总会在最不经意的时候出现
- 条款12:复制对象的时候不要忘了其每一个部分
- 打开xml的时候不要用写字板
- 复杂布局的时候,不要复制布局
- 字符编码(正在做fbreader的研究工作抄来看看)
- [转]字符编码-使用c#研究
- GridView导出Execl的时候移去不要的欄位
- [搬砖]无聊的时候研究下方程1/a±1/b=1/c的整数解的个数(修正版)
- DoModal返回-1,对话框不能显示,今天碰到项目在用unicode编码,和多字符编码时候出现的
- 字符编码研究
- Android expandablelistview在展开组的时候不要滚动
- 读书笔记 effective c++ Item 21 当你必须返回一个对象的时候,不要尝试返回引用
- 打印调试数组的值的时候,注意不要改变
- java中提供了对正则表达式的支持。 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码。 注意:只填写缺少代码,不要
- 我若不要强、不独立、不变厉害,谁会在我最无助的时候伸出援手
- 不要再浪费机会了------点球心理学研究