Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux中的当前区域设置如何影响在C代码中使用文件名?_C_Linux_Unicode - Fatal编程技术网

Linux中的当前区域设置如何影响在C代码中使用文件名?

Linux中的当前区域设置如何影响在C代码中使用文件名?,c,linux,unicode,C,Linux,Unicode,我在C程序中使用国际化文件名。特别是在我的代码中,我创建了带有中文符号的文件: int fd = open("/tmp/⺴", O_WRONLY | O_CREAT | O_TRUNC); 尽管我的系统语言环境是俄语(LANG=ru_ru.UTF-8),但该函数运行良好,并创建了文件 为什么在我的语言环境似乎不支持中文符号代码的情况下创建此文件?在这种情况下,受系统语言环境影响的字段是什么?函数的open(2)只是open系统调用的一个包装器,除了将参数放入正确的寄存器、执行系统调用和检索其返

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

您的代码集是UTF-8;它支持汉字以及西里尔语、印地语、阿拉伯语、希伯来语、希腊语等,基本上支持所有人类语言,尽管可能还有一些深奥的语言尚未用Unicode定义(克林贡语未表示)。底层文件系统可能支持UTF-8名称(UTF-8中的任何字符)。区域设置中的俄语部分所做的是确保西里尔文字符按俄罗斯人期望的方式进行适当排序,但它为非西里尔文字符提供了一些排序(可能,但不一定是“代码集顺序”)。@JonathanLeffler您有关于linux文件系统“支持”utf-8的参考资料吗?在linux上,路径只是以null结尾的字节字符串,没有特定的编码。它们可以是utf-8,就像它们可以是其他任何东西一样。如果您尝试使用ebcdic文件名,那么linux将把
a
作为路径分隔符;-)@莫西,你说得对。Linux内核只将文件名视为一个字节字符串,
open
syscall也是如此。实际上,内核必须做一些工作才能正确支持UTF-8文件名。具体来说,它需要规范组合形式。您不允许(也不希望)拥有不同的文件
schön
schön
。因此,如果您使用前一种拼写创建一个文件名,内核应该悄悄地将其转换为后一种拼写。我知道MacOS会这样做,我也会认为Linux会这样做,尽管mosvy的回答提出了相反的建议。另请看,我认为内核应该规范组合表单和预组合表单,以避免排名混乱和安全漏洞。马科斯做到了这一点;我不知道Linux没有。(但这是一个有趣的折衷,“不管发生什么,都把它当作一个字节字符串”和“满足各种其他目标”。)