![Linux 上的文件名和路径使用什么字符集编码?](https://linux22.com/image/41966/Linux%20%E4%B8%8A%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E8%B7%AF%E5%BE%84%E4%BD%BF%E7%94%A8%E4%BB%80%E4%B9%88%E5%AD%97%E7%AC%A6%E9%9B%86%E7%BC%96%E7%A0%81%EF%BC%9F.png)
这取决于我使用的文件系统吗?例如,ext2/ext3/ext4,但当我插入一张带有 ISO 9660 的“joliet”CD-ROM 时会发生什么情况?我听说 POSIX 包含某种文件名字符集编码规范?
本质上,我想知道的是,如果我获得了 UTF-8 编码的文件名,在将其传递给 Linux 中的文件 I/O API 之前,我需要进行哪些处理/转换?
答案1
正如其他人所指出的,对此没有真正的答案:文件名和路径没有编码;操作系统仅处理字节序列。各个应用程序可能会选择将它们解释为以某种方式编码,但这会有所不同。
具体来说,Glib(由 Gtk+ 应用程序使用)假定所有文件名均采用 UTF-8 编码,无论用户的区域设置如何。这可能会被环境变量覆盖G_FILENAME_ENCODING和G_BROKEN_FILENAMES。
另一方面,Qt 默认为假设所有文件名都以当前用户的区域设置进行编码。单个应用程序可以选择覆盖此假设,尽管我不知道有任何这样做,并且没有外部覆盖开关。
现代 Linux 发行版的设置使得所有用户都使用 UTF-8 语言环境,并且外部文件系统挂载上的路径将转换为 UTF-8,因此这种策略差异通常没有影响。但是,如果您确实想要安全,则不能假设任何超出“NUL 终止、'/' 分隔的字节序列”的文件名结构。
(另请注意:区域设置可能因进程而异。同一用户运行的两个不同进程可能仅通过设置不同的环境变量而处于不同的区域设置。)
答案2
Linux 的 unix/posix 层并不关心你使用哪种编码。它按原样存储当前编码的字节序列。
我认为这些挂载选项可以帮助您将定义字符集的特定文件系统转换为系统字符集。 (CDROM、NTFS 和 FAT 变体使用一些 unicode 变体)。
我希望unix定义一个系统全局编码,但它实际上是每个用户的设置。因此,如果您定义了与您同事不同的编码,您的文件名将显示不同。
答案3
这取决于您如何挂载文件系统,只需查看man mount
.例如iso9660
、vfat
和fat
有iocharset
和utf8
选项。