LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3694|回复: 25

总结:codepage与iocharset

[复制链接]
发表于 2006-7-11 13:04:50 | 显示全部楼层 |阅读模式
论坛里牛人很多,本来不想献丑。但是发现还是有不少同学概念不是很清楚,
可能还是需要明确一下,所以还是发过来吧

=================以下正文===========================
用了这么长时间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~~
发表于 2006-7-11 13:38:55 | 显示全部楼层
看老兄的帖终于搞明白了,再顶一下
回复 支持 反对

使用道具 举报

发表于 2006-7-11 13:40:37 | 显示全部楼层
谢谢楼主,俺中文不好,能否多举几个例子来说明挂载方式的差异?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-7-11 14:05:07 | 显示全部楼层
Post by d00m3d
谢谢楼主,俺中文不好,能否多举几个例子来说明挂载方式的差异?
版主客气了。不知道你想要我举什么样的例子?
所有的挂载方式都只影响文件名的解释,内容的解释只受程序的locale影响,与挂载方式无关。
如果程序本身支持编码转换(GTK2的程序好像都支持),则采用utf8挂载的分区在以非utf8 locale启动这些程序时也可以正常访问--我不清楚这个特性是不是真的有用。
当然还有一个就是用utf8挂载就可以同时显示多国语言编码的文件。比如有些日语歌
回复 支持 反对

使用道具 举报

发表于 2006-7-11 14:13:19 | 显示全部楼层
楼上版主都搞不明白啊。。


    让我代楼主说说,
  
UNICODE == UTF8,   “现代”的OS 内部都用 UNICODE(如>=W2K  LINUX >= ? )编码

WIN里  9x 的 FAT32 是“杂种”,, 短长文件名不同编码方式?
WIN 里 NTFS 是纯 UNICODE 。。

LINUX 里的 FS 根据猜测应该不是用 UNICODE,,不然也用不着 convmv 了。

*本地 LINUX 显示、内部都使用 UTF-8 ,这样也不用变来变去了。。

*要在 LINUX 下以 UTF8 “管理” 其它 如 WIN FAT32 ,NTFS ,samba 之流,
就在 mount 时,,codepage 不用管,原来是什么就是什么,iocharset/nls (显示) =utf8 就 OK 了。


  给我一颗utf8  的心--期待世界大一UNI。。
回复 支持 反对

使用道具 举报

发表于 2006-7-11 14:16:50 | 显示全部楼层
...还以为楼主不在,现炒卖个斧头
回复 支持 反对

使用道具 举报

发表于 2006-8-17 19:34:21 | 显示全部楼层
在网易发贴乱码是怎么回事?
回复 支持 反对

使用道具 举报

发表于 2006-8-18 14:52:45 | 显示全部楼层
unicode是一个编码标准,utf-8、unicode16、unicode32是unicode的各种实现,windows nt内部使用的是unicode16,unix兼容软件内部大多用unicode32/utf8。
回复 支持 反对

使用道具 举报

发表于 2006-8-19 00:09:45 | 显示全部楼层
是的,utf8的locale,很容易搞定所有的.
回复 支持 反对

使用道具 举报

发表于 2006-8-19 12:54:40 | 显示全部楼层
mount -t vfat -o utf8 就可以全搞定了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表