标签:必须 命令行 window 显示文件 文件的 ucs 包括 函数 使用
到文件名乱码的问题,需要明确两点
但Linux内核只能逐字节处理编码流(而Windows NT内核是UCS-2的,逐2字节处理编码流),因此必须采用某种单字节编码(这包括所有的不定长编码)进行输出——这就是Linux内核所谓的NLS,对应于Windows的codepage。
在对文件名的处理上,fat和vfat的区别在于:fat/msdos只支持短文件名(8.3命名法),而vfat加入了对长文件名和UNICODE的支持。
为了保持与fat的兼容性,在vfat中,每个文件同时拥有“长”文件名和短文件名,其中短文件名不区分大小写(实际上是不允许小写字母出现在文件 名中)。可以这么理解,对于vfat,“长文件名”是文件真正的名字,“短文件名”则是提供兼容性的名字。举例来说,文件“真名”为abc.txt,它的 短文件名是ABC.TXT;文件“真名”为alongname.txt,它的短文件名则是ALONGN~1.TXT。
无论是fat还是vfat,短文件名按codepage编码存储,长文件名按UNICODE编码存储。因此,如果文件的真名(也就是长文件名)是s,短文件名是s′,则它们在文件系统中分别被存储为
为了访问fat/vfat文件系统,我们需要用内核的msdos或vfat模块。它们有三个跟字符集有关的内核参数:codepage,iocharset,utf8。我们来确定它们对应着什么样的编码或解码函数。
这样,参数有如下的具体选择:
codepage=936
iocharset=cp936
iocharset=utf8
但这样做的缺点是会导致vfat模块将允许短文件名使用小写字母,这与windows是不兼容的(使用iocharset=utf8时,内核会出一条警告信息的——这比较没道理,估计是个历史遗留问题);
最后是结论:
mount -t vfat -o iocharset=cp936
mount -t vfat -o iocharset=utf8
mount -t vfat -o iocharset=cp936,utf8
实际上只要内核默认的iocharset不是utf8,直接写
mount -o utf8
就可以,这里iocharset=xxx的作用仅仅是处理大小写,所以怎么填都没关系。
我们来看一下这些选项究竟做了些什么事情,假设一个FAT文件系统在简体中文的windows上用过,而Linux程序的locale设置为UTF-8,文件名为s,其短文件名为s′
标签:必须 命令行 window 显示文件 文件的 ucs 包括 函数 使用
原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8856486.html