关于codepage与iocharset[转自sina-blog]

Linux用了这么久,有一点比较郁闷的就是它的中文的字体显示问题了。唉,谁叫这些个操作系统啊,桌面环境啊,应用软件啊都是外国人写的呢?

    以前在Linux下挂载windows的分区都会出现中文字符显示乱码的问题。后来知道要在mount时加上iocharset和codepage这两个参数,但是一直不知道这两个参数的来源。恰好昨天一个同学又问了我这个问题,就上网搜了一下。
    下面转载linuxsir上的FireMeteor的一篇文章,学习一下:

——————————————————————-

作者 FireMeteor

参考资料:内核文档,mount的manpage。windows部分基本上凭自己的记忆--不可靠

由于资料来源与本人理解表述的关系,可能存在错漏之处
     codepage是m$搞出来的东西。早期的操作系统都是直接使用本地语言字符集(nativelanguage character set,NLS),屏幕显示如此,内部表示也如此。dos就是一个典型的例子。m$把这种本地字符集称作codepage。常见的codepage有CP437(美、加),CP850(欧),CP932(日),CP936(简体中文,gbk),CP950(繁体中文BIG5)等。在dos时代,fat文件系统里面存储的文件名也使用codepage。这些东西似乎是unicode出来以前,m$根据一些国家的国家标准搞的,所以相互之间编码冲突比较严重,一旦代码页设置错误,显示结果就乱七八糟。

    windows9x似乎主要还是采用代码页机制,但是对unicode也有了部分支持。其新增的长文件名支持使用unicode存放文件名。在linux中叫做vfat。也就是说,短文件名用codepage,长文件名用unicode。记得以前在windows9x里面打日文游戏的时候还需要日文环境的支持,否则全是乱码。但是不管怎么支持,屏幕中总有一部分乱码,不是中文乱,就是日文乱。这大概就是codepage只支持一种本地语言的缘故。

   到2000以后,系统内核处理字符串的时候总是先转换成unicode,在显示输出的时候,再视情况转回本地字符集,所以情况要好很多。理论上说,所有unicode程序,在2000下都能同时正常显示,也就是说中文、日文、韩文等都可以同屏显示。但是使用本地字符集

的程序还是同时只有一种语言能够正常显示。

   下面摘一段win XP区域和语言选项“对话框里面关于本地语言的说明文字:这个设置启动某些非Unicode程序以便用母语显示菜单和对话。这不会影响到Unicode的程序“以上都是背景资料,也就是说都是废话-_-
   在linux下mount东西的时候,只有在mount和m$有关的东西的时候才需要设置codepage。最典型的就是fat。joliet格式的CDROM可能也要,但是我不用cd好多年,哪位帮忙确认一下……还有就是smbfs,在samba server端配置好dos charset参数,然后mount的时候codepage写成跟server一样即可。关于samba,跑题一句,其实doscharset参数在用smbclient访问的时候根本不用设,因为新的客户端(win2000,xp)都用unicode通信,这个参数只对使用codepage的dos,9x有效,但是因为smbmount也使用codepage,所以……codepage设置以后起的作用是用来在读写文件系统时进行编码与解码。因为在linux内部表示字符串的时候也是用unicode的,这里存在一次unicode到本地字符集之间的转换。
    以上是关于codepage的部分,下面是iocharset部分
    iocharset比较简单,它只与显示输出有关。这里不得不提起locale,因为locale
控制了软件关于输入输出的很多细节。可以分别配置locale的每个选项,但是这跟我现在要说的没多大关系,所以我假设只配置LANG或者LC_ALL。说了那么多废话,其实iocharset控制的就是系统内部unicode表示到显示输出的表示间的转换。也就是说,iocharset要与你使用的locale匹配,否则显示乱码那是理所当然的了。
    总结一下:

   文件系统编码<–codepage—>内部unicode表示<—iocharset/NLS—>显示输出编码其实上面说那么多都是废话。最王道的办法应该是把locale设成utf8(zh_CN.UTF-8或者en_US.UTF-8随便) ,然后在mount fat或者nfts的时候用一个-o utf8参数,整个世界都清静了。codepage?iocharset?那是啥?不过话又说回来locale设成utf8有一点不好的地方,如果文件内容是用本地语言编码的,而且软件不支持编码转换的话,可能会无法正常显示。但是这种情况使用gb2312或者gbk也不能完全避免,只是发生的概率要小一些罢了。实际上即使在utf8下我也只碰到过一个实例:xmms不能处理某些mp3的标签,因为ID3V1是用bgk编码的,所以我单独用bgk编码启动xmms~~