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

mar*_*tin 52 character-encoding filenames locale

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

本质上,我想知道的是,如果我得到了一个 UTF-8 编码的文件名,在我将它传递给 Linux 中的文件 I/O API 之前我需要做什么处理/转换?

eph*_*ent 53

正如其他人所指出的,对此并没有真正的答案:文件名和路径没有编码;操作系统只处理字节序列。个别应用程序可能会选择将它们解释为以某种方式编码,但这会有所不同。

具体来说,Glib(由 Gtk+ 应用程序使用)假定所有文件名都是 UTF-8 编码,而不管用户的 locale。这可能会被环境变量G_FILENAME_ENCODINGG_BROKEN_FILENAMES 覆盖

另一方面,Qt 默认假设所有文件名都以当前用户的 locale 编码。个别应用程序可能会选择覆盖这个假设,但我不知道有任何这样做,并且没有外部覆盖开关。

现代 Linux 发行版的设置使得所有用户都使用 UTF-8 语言环境,并且外部文件系统挂载上的路径被转换为 UTF-8,因此这种策略差异通常没有影响。但是,如果您真的想要安全,则不能假设任何关于文件名的结构超出“以 NUL 结尾、以 '/' 分隔的字节序列”。

(另请注意:区域设置可能因进程而异。同一用户运行的两个不同进程可能位于不同的区域设置中,只需设置不同的环境变量即可。)

  • “NUL-terminated, '/'-delimited 字节序列” 但是没有编码,你怎么知道什么字节代表'/'? (2认同)

小智 11

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

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

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


Ada*_*tek 5

这取决于您如何挂载文件系统,只需查看man mount. 例如iso9660vfat并且fatiocharsetutf8选项。