c - Linux 中的当前语言环境如何影响在 C 代码中使用文件名?

标签 c linux unicode

我在我的 C 程序中使用国际化文件名。特别是我的一段代码,我用中文符号创建文件:

int fd = open("/tmp/⺴", O_WRONLY | O_CREAT | O_TRUNC);

尽管我的系统区域设置为俄语 (LANG=ru_RU.UTF-8),但此功能运行良好并且文件已创建。

为什么我的语言环境似乎不支持中文符号代码却创建了这个文件?在这种情况下,受系统区域设置影响的字段是什么?

最佳答案

open(2) 函数只是 open 系统调用的一个包装器——除了将参数放入正确的寄存器之外,它没有做任何其他事情,执行系统调用并检索其返回值。

而且内核根本不知道也不关心语言环境。

具体来说,在 open(2)path 参数中,唯一具有特殊意义的字节是 47 (/),它分隔路径元素和终止它的 0(NUL 字节)。

内核和大多数文件系统都不会阻止您创建名称格式错误的 utf-8 或任何二进制垃圾的文件——对于内核而言,它们只是字节。

此外,内核没有进行任何 unicode 规范化或混淆处理:

$ echo > ∕еtс∕раsswd; touch hó hó
$ ls
hó  hó  ∕еtс∕раsswd

关于c - Linux 中的当前语言环境如何影响在 C 代码中使用文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749288/

相关文章:

C 幂函数负指数,无需 pow()

C复数和printf

c - C 中的文件描述符分配

python - 地址已被使用但在 netstat 或 lsof 中没有任何内容

c++ - ucontext 和线程本地存储

c - 删除 c 中的前导零

linux - 如何将行号变量传递给 sed,以删除该行之后的所有行

regex - 在 PERL 中正确输出特殊字符(unicode)

html - 为什么我在纯 HTML 中得到一个字符?

unicode - Go 中 unicode 中 IsDigit 和 IsNumber 的区别