|
|
论坛里牛人很多,本来不想献丑。但是发现还是有不少同学概念不是很清楚,
可能还是需要明确一下,所以还是发过来吧
=================以下正文===========================
用了这么长时间linux,这两个东西一直分不清楚。以前一直是尝试直到可以正常显示中
文,然后把最后的参数记下来,现在总算可以说清楚为什么了。
作者 FireMeteor
参考资料:内核文档,mount的manpage。windows部分基本上凭自己的记忆--不可靠
由于资料来源与本人理解表述的关系,可能存在错漏之处
codepage是m$搞出来的东西。早期的操作系统都是直接使用本地语言字符集(native
language 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,跑题一句,其实dos charset参数在用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~~ |
|