您尚未登录。

#1 2015-05-29 10:29:48

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

关于FAT的挂载选项

Android的存储卡文件系统,应该是FAT32的没错。

[xtricman@localhost ~]$ sudo mount -t vfat /dev/sdb1 /mnt -o fat=32
[xtricman@localhost ~]$ ls /mnt/documents
[Addison-Wesley Professional] C Primer Plus 6th Edition.pdf
Beginning Linux Programming 4th edition.pdf
Linear algebra done right.pdf
OReilly.Mastering.Regular.Expressions.3rd.Edition.Aug.2006.pdf
????-???????.pdf
????-???.pdf
?????????-???.pdf
Programming in Lua 3rd Edition.pdf
[xtricman@localhost ~]$ sudo umount /dev/sdb1
[xtricman@localhost ~]$ sudo mount -t vfat /dev/sdb1 /mnt -o fat=32,iocharset=utf8
[xtricman@localhost ~]$ ls /mnt/documents/
[Addison-Wesley Professional] C Primer Plus 6th Edition.pdf
Beginning Linux Programming 4th edition.pdf
Linear algebra done right.pdf
OReilly.Mastering.Regular.Expressions.3rd.Edition.Aug.2006.pdf
Programming in Lua 3rd Edition.pdf
热力学与统计物理学-林宗涵.pdf
数理逻辑-北京大学出版社.pdf
数学分析-梅加强.pdf

1.为什么不加fat32参数会直接提示文件系统类型错误。
2.为什么挂载一定要加iocharset参数?按照问号的个数来看,不加iocharset参数的时候也正常地识别到了字符没有乱码不是吗?为什么不加iocharset参数就会不能显示汉字?
3.总之就是想问,为何有时候终端上会发生识别到了字符但是显示成问号的情况?

(应该不是lxterminal的问题,因为ls其他文件系统的时候都是能正常显示汉字的)


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2015-05-29 16:59:47

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,222
个人网站

Re: 关于FAT的挂载选项

大概查了查:

对于一般的 Linux 文件系统,文件名是什么编码,文件系统这一层是不管的,内核只把文件名当作一串字节流。程序现在读到了这一串字节流,当成什么编码解释,就是程序的事情了。

但 fat 不一样。fat 有两套文件名,一套是8.3短文件名,一套是长文件名。长文件名就是我们现在通常看到的文件看,它是总是按UTF16编码存储的!为了和普通的 Linux 文件系统保持统一,内核要把 UTF16 编码的长文件名先通过某种规则转换一下。iocharset就是控制这玩意儿的。

然后具体究竟是怎么转换的,我还没搞明白……


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#3 2015-05-29 17:12:01

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 关于FAT的挂载选项

cuihao 说:

大概查了查:

对于一般的 Linux 文件系统,文件名是什么编码,文件系统这一层是不管的,内核只把文件名当作一串字节流。程序现在读到了这一串字节流,当成什么编码解释,就是程序的事情了。

但 fat 不一样。fat 有两套文件名,一套是8.3短文件名,一套是长文件名。长文件名就是我们现在通常看到的文件看,它是总是按UTF16编码存储的!为了和普通的 Linux 文件系统保持统一,内核要把 UTF16 编码的长文件名先通过某种规则转换一下。iocharset就是控制这玩意儿的。

然后具体究竟是怎么转换的,我还没搞明白……

文件名确实是字节流,到字符的转换是由诸如ls之类的文件管理器完成的,ls的转换规则由locale定义。

然而这并没有什么卵用,因为你查man mount能查到FAT有 iocharset和codepage参数,这是EXT之类的文件系统没有的,但这俩参数如何运作仍不清楚,何况你看见了我没加参数也没有乱码。


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#4 2015-05-29 23:01:22

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,470
个人网站

Re: 关于FAT的挂载选项

xtricman 说:

文件名确实是字节流,到字符的转换是由诸如ls之类的文件管理器完成的,ls的转换规则由locale定义。

然而这并没有什么卵用,因为你查man mount能查到FAT有 iocharset和codepage参数,这是EXT之类的文件系统没有的,但这俩参数如何运作仍不清楚,何况你看见了我没加参数也没有乱码。

Documentation/filesystems/vfat.txt 说:
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.

这个选项用于在用户可见文件名与 FAT 文件系统中的 UTF-16 文件名之间转换。默认是 iso8859-1,也就是说,如果是 iso8859-1 之外的字符,vfat 模块并不知道如何转码,于是给用户态程序返回问号。vfat 当然知道那个名字有多少个字符,但是它没办法转换。这和用户态的 locale 没关系。

离线

#5 2015-05-30 00:20:39

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 关于FAT的挂载选项

百合仙子 说:

这个选项用于在用户可见文件名与 FAT 文件系统中的 UTF-16 文件名之间转换。默认是 iso8859-1,也就是说,如果是 iso8859-1 之外的字符,vfat 模块并不知道如何转码,于是给用户态程序返回问号。

懂了,能正常按UTF-16解码文件名,但是无法将部分字符按iso8859-1重编码(无法编码某些Unicode汉字),不得不返回问号。

那codepage参数又是什么意思。为什么其他文件系统没有这俩参数。


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#6 2015-05-30 00:36:06

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,470
个人网站

Re: 关于FAT的挂载选项

xtricman 说:
百合仙子 说:

这个选项用于在用户可见文件名与 FAT 文件系统中的 UTF-16 文件名之间转换。默认是 iso8859-1,也就是说,如果是 iso8859-1 之外的字符,vfat 模块并不知道如何转码,于是给用户态程序返回问号。

懂了,能正常按UTF-16解码文件名,但是无法将部分字符按iso8859-1重编码(无法编码某些Unicode汉字),不得不返回问号。

那codepage参数又是什么意思。为什么其他文件系统没有这俩参数。

codepage 是转换到短名用的。因为这是 FAT 才有的特性。你自己去看文档啦。

离线

#7 2015-05-30 13:27:46

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,222
个人网站

Re: 关于FAT的挂载选项

但设置 iocharset=iso8859-1 能显示汉字。用 iso8859-1 编码汉字是什么意思?怎么把UTF16映射到iso8859-1的?


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#8 2015-05-30 13:38:35

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,470
个人网站

Re: 关于FAT的挂载选项

cuihao 说:

但设置 iocharset=iso8859-1 能显示汉字。用 iso8859-1 编码汉字是什么意思?怎么把UTF16映射到iso8859-1的?

咦,可 iso8859-1 是默认值才对呀。你 zgrep IOCHARSET /proc/config.gz 看看?

离线

#9 2015-05-30 13:39:54

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,222
个人网站

Re: 关于FAT的挂载选项

哦,iso8859-1 支持“中文”其实是一种假象。
iso8859-1 一个字节0x00~0xff全都是有效的,相当于每个字节都解释成一个字符,就是字节流了。

也就是说,用 iocharset=iso8859-1 挂载时,我创建一个中文文件名的文件,存储时实际上是把每个中文字符拆成三个 iso8859-1 的字符,再转换为三个UTF16字符存入 vfat 分区了。

然后又发现有个叫 utf8 的mount参数,好像加上后就跟覆盖 iocharset=utf8 差不多,但是用 iocharset=iso8859-1,utf8 的话,文件名大小写不敏感,这和 iocharset=utf8 是不同的。


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

#10 2015-05-30 13:41:18

cuihao
所在地: USTC, Hefei
注册时间: 2011-08-19
帖子: 1,222
个人网站

Re: 关于FAT的挂载选项

图形界面文件管理器点挂载时,默认挂载参数是 codepage=437,iocharset=iso8859-1,utf8


Site: CVHC.CC   Twitter: @cuihaoleo   Org: LUG@USTC
AD:  ~欢迎参与志愿计算~

离线

页脚