Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313734
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: C/C++

2007-11-29 22:41:22

吴小明 网友.
 
乱码问题与 XML格式没什么关系, 如果有关系, 那也是一些文本编辑程序识别XML文件头部 中的 encoding="utf-8" 这样的部分, 以此决定或辅助决定文件的实际编码. 另外就是一些编码方案如UTF-8, UTF-16 文件最开头可能会有2/3个字节的所谓 BOM(Byte order Mark), 同样是告诉程序它是什么编码的.
 
彻底弄清楚这个问题需要了解 字符集, 编码, 代码页, 字体 这些概念, 相关的东西可能还有 UTF8, Unicode, UTF-16等等, 以此为关键字搜索, 你自然会得到相关的一大片知识, 不用我在这里企图盖全.
 
你碰到的问题并不奇怪, 从根本上说, 没有任何手段防止一个文件中一部分是某种正确的编码, 另一部分是其它编码或就是任意的二进制值, 所以文本编辑器/字处理程序所能做的最好的事也只是尽最大可能地"猜测"文件的编码, 说"猜测"是因为 notepad内部的确使用了一个根据文件头部的内容来推测其编码的试探性算法.

是我用 google 随便搜出来的关于此类问题的一个网页. 其中
说…… 的那个我没有试出来之外, 前面的"联通", "AAAA BBB CCC DDDDD" 的例子都可以证实, 你用二进制 dump工具查看编码的话应该很容易了解原因, 比如"联通"二字会变成黑框, 是因为它按"ANSI" 保存, 而在中文系统上, 微软所谓的ANSI就是你的当前代码页的设置, 对于简体中文系统, 就是CP936, 编码方案实际上是GB2312, 而如果你有意识地在文件保存对话框中选择Unicode保存, 这个问题就不会出现, 这是因为在真正编码"联"字之前, 文件最开关保存了特殊字节 0xff 0xfe, 对于Unicode Big endian 和 UTF-8有类似的BOM.
下面是"联通" 这两个字分别以这四种不同编码保存时的情况:

先注意一下记事本中的保存选项:

下面的不是按ANSI 在第一项的顺序保存的, 不是我弄错了.

另一个可能性与OS的区域设置支持和系统里安装的字体有关, 这方面请参考下面的资料.
 
象 vim这样强大成熟的编辑器, 也经常会发生错误判断文件编码的情况, 所以我的vim中定义了一个命令:
:command! U8 :set encoding=utf-8

emacs在判断文件编码方面就我有限的经验来说要好一些. 你可以试用一些专业的XML编辑器, 如XML-Spy, 或许会对文件编码做出更好的判断.
 
中日韩三国文字有很大部分的重合, 在Unicode编码方案上为了节省空间也对相同的字符进行了共享处理, 日文的情况尤甚, 我自己的经验, 在vim中如果编码设置正确, 即使OS没有设置日文, 看到正确的片假名是不成问题的.
 
相关参考资料:
1. Joe on software: (前文已经提到这个资料, 这里再强力推荐一下)

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

2. [Windows 图形编程] (英文名为 Windows Graphics Programming Win32 GDI and DirectDraw)
第14章 字体
第15章 文本
 
3. [Programming Windows] (by petzold)
第二章 Unicode 简介
 
看到你的留言时已经迟了2个多月, 希望这些能帮助你了解一些背后的原因.
阅读(1828) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~