Linux上的文件名和路径使用哪种字符集编码?


45

是否取决于我使用的文件系统?例如,ext2 / ext3 / ext4,但是当我插入一张带有ISO 9660的“ joliet” CD-ROM时会发生什么呢?我听说POSIX包含某种文件名字符集编码规范?

本质上,我想知道是否有UTF-8编码的文件名,在将其传递给Linux中的文件I / O API之前需要进行哪些处理/转换?


下面的答案说操作系统和文件系统不关心编码。某些文件系统(例如HFS +)确实非常重要。我相信,HFS +需要使用UTF-8,并将其内部转换为UTF-16的受限方言。NTFS也有类似的问题,但我不清楚细节。
zmccord 2015年

HFS +还要求对名称进行分解,这与linux使用precomposed的趋势不太匹配。web.archive.org/web/20080518105836/http://developer.apple.com/…–
user12439

Answers:


49

正如其他人所指出的那样,这确实没有答案:文件名和路径没有编码。OS仅处理字节序列。各个应用程序可能选择将它们解释为以某种方式进行编码,但这有所不同。

具体来说,Glib(由Gtk +应用程序使用)假定所有文件名都是UTF-8编码的,而与用户的语言环境无关。这可以用环境变量G_FILENAME_ENCODINGG_BROKEN_FILENAMES覆盖

另一方面,Qt默认假定所有文件名都在当前用户的语言环境中编码。单个应用程序可能会选择覆盖此假设,尽管我不知道会做任何事情,并且没有外部覆盖开关。

设置现代Linux发行版,以便所有用户都使用UTF-8语言环境,并将外部文件系统挂载上的路径转换为UTF-8,因此,这种策略差异通常无效。但是,如果您确实希望安全起见,则除了“以NUL终止,以'/'分隔的字节序列”以外,您不能假设有关文件名的任何结构。

(还请注意:语言环境可能会因进程而异。同一用户运行的两个不同进程可能只是通过设置不同的环境变量而位于不同的语言环境中。)


1
“以NUL终止的'/'分隔的字节序列”但是,如果没有编码,您如何知道哪个字节代表'/'?
杰克

1
@Jack始终'\x2F'不管是什么样/。SJIS明显不同。
6

1
啊好吧。您是否考虑使用该信息更新答案?也许仅仅是因为我最近在研究字符集转换库,但是短语“'/'定界的字节序列”对我来说毫无意义。
杰克

那么如何在HEX的SSH会话中查看文件名的字节?
DIMS

11

linux的unix / posix层不在乎您使用哪种编码。它按原样存储当前编码的字节序列。

我认为这些安装选项可以帮助您将定义字符集的特定文件系统转换为系统字符集。(CDROM,NTFS和FAT变体使用一些unicode变体)。

我希望unix定义系统全局编码,但实际上是每个用户设置。因此,如果您定义的编码和同事不同,则文件名将以不同的方式显示。


好的,那么我可能应该检查用户当前正在使用的语言环境并将其转换为新文件,以便他可以在Nautilus等中正确看到文件名。如何确定当前用户的当前文件名字符集是什么?
马丁

1
@martin甚至还不是那么简单...不同的过程可以使用不同的编码,具体取决于env变量和它所使用的语言。– 2016
基本

5

这取决于您如何挂载文件系统,只需查看中的不同文件系统的挂载选项即可man mount。例如和iso9660vfatfat具有iocharsetutf8选项。


因此,如果我使用utf8挂载它,是否还应该将utf8传递给open()syscall?
马丁

我也发现了这个(library.gnome.org/devel/glib/unstable/…),这似乎表明文件名的字符集编码取决于设置的语言环境?
马丁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.