fopen()或open()使用什么字符编码?

时间:2018-06-11 03:37:18

标签: c linux character-encoding

使用fopen()之类的函数时,必须为文件名传递一个字符串参数。我想知道这个字符串的字符编码应该是什么。

这个问题已经被问到here,但它有相互矛盾的答案。一个答案说明如下:

  

这取决于系统区域设置。看一下“语言环境”的输出   命令。如果变量以UTF-8结尾,则您的语言环境为UTF-8。   大多数现代linux都将使用UTF-8。虽然安德鲁是正确的   从技术上讲,它只是一个字节字符串,如果你不匹配   系统区域设置某些程序可能无法正常工作,它将是   不可能得到正确的用户输入等。最好坚持下去   UTF-8。

虽然另一个答案说明如下:

  

Linux上的文件系统调用是编码不可知的,即它们没有   (需要)了解特定的编码。就他们而言   有关,filename参数指向的字节串是   按原样传递给文件系统。文件系统期望这样   文件名采用正确的编码方式(通常为UTF-8,如下所述)   马修塔尔伯特)。

     

这意味着您通常不需要做任何事情(文件名是   被视为不透明的字节串),但它实际上取决于你的位置   接收文件名,以及是否需要操作   文件名以任何方式。

哪个答案是正确的?

1 个答案:

答案 0 :(得分:4)

他们在某些方面都是正确的。

传递给文件系统调用的字符串是一个字节字符串,其中一个空字节标记字符串的结尾,并且' /'用于分隔路径组件。在文件名段中,字节的含义对于文件系统来说并不重要 - 它们只是一个字节序列。

如何显示形成文件名的字节取决于用于显示它们的设备。如果名称使用带有非ASCII字符的UTF-8,则使用ISO 8859-15(或美国的顽固居民的8859-1)打印该数据会产生乱码,通常包括字节范围0x80 ... 0x9F中的C1控制字节。如果名称使用带有非ASCII字符的8859-15,则会出现无效UTF-8的序列,并且您将显示难以辨认或无意义的数据(问号或无效UTF-8序列的其他指示)。