我在我的 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/