是否取决于我使用的文件系统?例如,ext2 / ext3 / ext4,但是当我插入一张带有ISO 9660的“ joliet” CD-ROM时会发生什么呢?我听说POSIX包含某种文件名字符集编码规范?
本质上,我想知道是否有UTF-8编码的文件名,在将其传递给Linux中的文件I / O API之前需要进行哪些处理/转换?
是否取决于我使用的文件系统?例如,ext2 / ext3 / ext4,但是当我插入一张带有ISO 9660的“ joliet” CD-ROM时会发生什么呢?我听说POSIX包含某种文件名字符集编码规范?
本质上,我想知道是否有UTF-8编码的文件名,在将其传递给Linux中的文件I / O API之前需要进行哪些处理/转换?
Answers:
正如其他人所指出的那样,这确实没有答案:文件名和路径没有编码。OS仅处理字节序列。各个应用程序可能选择将它们解释为以某种方式进行编码,但这有所不同。
具体来说,Glib(由Gtk +应用程序使用)假定所有文件名都是UTF-8编码的,而与用户的语言环境无关。这可以用环境变量G_FILENAME_ENCODING和G_BROKEN_FILENAMES覆盖。
另一方面,Qt默认假定所有文件名都在当前用户的语言环境中编码。单个应用程序可能会选择覆盖此假设,尽管我不知道会做任何事情,并且没有外部覆盖开关。
设置现代Linux发行版,以便所有用户都使用UTF-8语言环境,并将外部文件系统挂载上的路径转换为UTF-8,因此,这种策略差异通常无效。但是,如果您确实希望安全起见,则除了“以NUL终止,以'/'分隔的字节序列”以外,您不能假设有关文件名的任何结构。
(还请注意:语言环境可能会因进程而异。同一用户运行的两个不同进程可能只是通过设置不同的环境变量而位于不同的语言环境中。)
'\x2F'
不管是什么样/
。SJIS明显不同。
linux的unix / posix层不在乎您使用哪种编码。它按原样存储当前编码的字节序列。
我认为这些安装选项可以帮助您将定义字符集的特定文件系统转换为系统字符集。(CDROM,NTFS和FAT变体使用一些unicode变体)。
我希望unix定义系统全局编码,但实际上是每个用户设置。因此,如果您定义的编码和同事不同,则文件名将以不同的方式显示。
这取决于您如何挂载文件系统,只需查看中的不同文件系统的挂载选项即可man mount
。例如和iso9660
,vfat
并fat
具有iocharset
和utf8
选项。