LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: FireMeteor

总结:codepage与iocharset

[复制链接]
发表于 2007-4-12 13:30:07 | 显示全部楼层
楼主真是害人不浅啊。以下是内核documentaiont/vfat.txt对fat文件系统的说明。
codepage=###  -- Sets the codepage number for converting to shortname
                 characters
on FAT filesystem.
                 By default, FAT_DEFAULT_CODEPAGE setting is used.

iocharset=name -- Character set to use for converting between the
                 encoding is used for user visible filename and 16 bit
                 Unicode characters.
Long filenames are stored on disk
                 in Unicode format, but Unix for the most part doesn't
                 know how to deal with Unicode.
                 By default, FAT_DEFAULT_IOCHARSET setting is used.

                 There is also an option of doing UTF-8 translations
                 with the utf8 option.

                 NOTE: "iocharset=utf8" is not recommended. If unsure,
                 you should consider the following option instead.

utf8=<bool>   -- UTF-8 is the filesystem safe version of Unicode that
                 is used by the console.  It can be be enabled for the
                 filesystem with this option. If 'uni_xlate' gets set,
                 UTF-8 gets disabled.

首先大家要弄清楚,fat文件系统本身是不支持长文件名的,只支持8.3形式的,怎么实现长文件支持的呢,是占用了其他的Directroy Entry来实现的。应用程序一般只通过长文件名来存取文件,操作系统如何支持,使得短文件名对用户是透明的呢?这个就是内核nls配合codepage使用之后才做到的。
另外一点,短文件采用的是本地语言的编码,但是长文件都是采用ucs2的编码。无论是在fat还是在ntfs都是如此。
另外一点大家要明白,linux内核是不认识ucs2也不认识multibyte,对他来说任何字符都是8bit编码。
所以怎样让内核支持unicode的文件名呢?仍然是了nls模块,通过iocharset,就可以转换ucs2编码。
所以结果呢,codepage对于ntfs根本没用,因为ntfs已经没有了短文件名这个蹩脚的东西。
之所以大部分的人愿意采用iocharset=utf8来安装fat或者nls=utf8来安装ntfs,原因是因为没有任何一种charset所表示的字符数量能够超过utf8,因为utf8的charset可以表示所有ucs编码的字符。
回复 支持 反对

使用道具 举报

发表于 2007-4-13 14:09:31 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2007-4-13 17:45:10 | 显示全部楼层
Windows的文件系统已经强制使用Unicode编码了,
Linux的文件系统还没有实现国际化呢。。。。。。。最不满意就是Linux这点.....
回复 支持 反对

使用道具 举报

发表于 2007-4-13 17:53:30 | 显示全部楼层
Windows内核把任何字符都当作是16 bit的编码 (UTF-16)
Linux内核把任何字符都当作是8 bit的编码,什么UTF-8、GBK、Big-5、ISO8859-x全部通杀,只要是字节0结尾的字符串都行,管你会发生乱码不乱码的。

这就是最大的区别。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-14 21:55:23 | 显示全部楼层
Post by realtang
楼主真是害人不浅啊。以下是内核documentaiont/vfat.txt对fat文件系统的说明。
codepage=###  -- Sets the codepage number for converting to shortname
                 characters
on FAT filesystem.
                 By default, FAT_DEFAULT_CODEPAGE setting is used.

iocharset=name -- Character set to use for converting between the
                 encoding is used for user visible filename and 16 bit
                 Unicode characters.
Long filenames are stored on disk
                 in Unicode format, but Unix for the most part doesn't
                 know how to deal with Unicode.
                 By default, FAT_DEFAULT_IOCHARSET setting is used.

                 There is also an option of doing UTF-8 translations
                 with the utf8 option.

                 NOTE: "iocharset=utf8" is not recommended. If unsure,
                 you should consider the following option instead.

utf8=<bool>   -- UTF-8 is the filesystem safe version of Unicode that
                 is used by the console.  It can be be enabled for the
                 filesystem with this option. If 'uni_xlate' gets set,
                 UTF-8 gets disabled.

首先大家要弄清楚,fat文件系统本身是不支持长文件名的,只支持8.3形式的,怎么实现长文件支持的呢,是占用了其他的Directroy Entry来实现的。应用程序一般只通过长文件名来存取文件,操作系统如何支持,使得短文件名对用户是透明的呢?这个就是内核nls配合codepage使用之后才做到的。
另外一点,短文件采用的是本地语言的编码,但是长文件都是采用ucs2的编码。无论是在fat还是在ntfs都是如此。
另外一点大家要明白,linux内核是不认识ucs2也不认识multibyte,对他来说任何字符都是8bit编码。
所以怎样让内核支持unicode的文件名呢?仍然是了nls模块,通过iocharset,就可以转换ucs2编码。
所以结果呢,codepage对于ntfs根本没用,因为ntfs已经没有了短文件名这个蹩脚的东西。
之所以大部分的人愿意采用iocharset=utf8来安装fat或者nls=utf8来安装ntfs,原因是因为没有任何一种charset所表示的字符数量能够超过utf8,因为utf8的charset可以表示所有ucs编码的字符。

居然给我套了个这么大的帽子,我想有必要辩护一下……
实际上这个文档我也参考过的,我在最初的那篇文章里面是这么说的:
codepage是m$搞出来的东西。早期的操作系统都是直接使用本地语言字符集(native
language character set,NLS),屏幕显示如此,内部表示也如此。dos就是一个典型的
例子。m$把这种本地字符集称作codepage。
……
在dos时代,
fat文件系统里面存储的文件名也使用codepage。
……
windows9x似乎主要还是采用代码页机制,但是对unicode也有了部分支持。其新增的长
文件名支持使用unicode存放文件名。在linux中叫做vfat。也就是说,短文件名用
codepage,长文件名用unicode。

和文档里面的内容应该没有冲突。
至于我建议采用utf8也是有道理的。实际上,除了纯dos(Dos6.22以前)和windows的早期版本(win95,可能不包括98,记不清了)会显示默认显示短文件名以外,现在的系统都不显示短文件名了。winxp的dir有/x参数可以用来显示短文件名,但是并不是所有的文件都有短名。也就是说,短文件名这个特性基本上已经被废弃了。采用uft8来挂在vfat文件系统在日常使用中不会导致问题,除非你有特别的需要,必须和老系统打交道。
最后,我建议的是采用-o utf8,而不是iocharset=utf8
回复 支持 反对

使用道具 举报

发表于 2007-5-16 14:34:58 | 显示全部楼层
mount vfat的选项解释:

(1)codepage=936
       如果你是简体中文的,这个值必须是936.
       这个选项只在处理8.3短文件名时才起作用。
       codepage是用于当文件只有8.3短文件名而没有长文件名时,分区的字符集是使用什么编码的。毫无疑问,这个肯定是GBK编码,其值应该是936。Linux在处理当文件只有8.3短文件名而没有长文件名,按照这个参数的值,把字符串转换为Unicode(UTF-16或者UTF-32).

(2)iocharset=xxx
       这个值应该与你的Locale设置相同。
       例如你的locale设置为utf8,则这个值应该是utf8;如果你的locale设置为GBK,则这个值应该是cp936。
       因为Linux在处理文件名的时候,它并不管你的文件名是什么编码,只把文件名当作一个C字符串来看待。
       Windows下的文件名都是看作UTF-16的双字节串,Linux需要根据这个值把UTF-16双字节串转换为对应locale设置的C单字节字符串。
       UTF-8也当作是一种C单字节字符串。
      
      
例如,你的locale设置是UTF-8,而FAT32分区有个文件是"中文.txt",这个文件只有短文件名而没有长文件名时;Linux的处理如下:
(1) 根据codepage=936这个设置,把GB码的"中文.txt"转换为UTF-16或者是UTF-32串:  GBK--->UTF-16/UTF32
(2) 根据iocharset=utf8这个设置,把刚才的UTF-16/UTF-32转换为UTF-8
回复 支持 反对

使用道具 举报

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

本版积分规则

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