使用fopen()
之类的函数时,必须为文件名传递一个字符串参数。我想知道这个字符串的字符编码应该是什么。
这个问题已经被问到here,但它有相互矛盾的答案。一个答案说明如下:
这取决于系统区域设置。看一下“语言环境”的输出 命令。如果变量以UTF-8结尾,则您的语言环境为UTF-8。 大多数现代linux都将使用UTF-8。虽然安德鲁是正确的 从技术上讲,它只是一个字节字符串,如果你不匹配 系统区域设置某些程序可能无法正常工作,它将是 不可能得到正确的用户输入等。最好坚持下去 UTF-8。
虽然另一个答案说明如下:
Linux上的文件系统调用是编码不可知的,即它们没有 (需要)了解特定的编码。就他们而言 有关,filename参数指向的字节串是 按原样传递给文件系统。文件系统期望这样 文件名采用正确的编码方式(通常为UTF-8,如下所述) 马修塔尔伯特)。
这意味着您通常不需要做任何事情(文件名是 被视为不透明的字节串),但它实际上取决于你的位置 接收文件名,以及是否需要操作 文件名以任何方式。
哪个答案是正确的?
答案 0 :(得分:4)
他们在某些方面都是正确的。
传递给文件系统调用的字符串是一个字节字符串,其中一个空字节标记字符串的结尾,并且' /
'用于分隔路径组件。在文件名段中,字节的含义对于文件系统来说并不重要 - 它们只是一个字节序列。
如何显示形成文件名的字节取决于用于显示它们的设备。如果名称使用带有非ASCII字符的UTF-8,则使用ISO 8859-15(或美国的顽固居民的8859-1)打印该数据会产生乱码,通常包括字节范围0x80 ... 0x9F中的C1控制字节。如果名称使用带有非ASCII字符的8859-15,则会出现无效UTF-8的序列,并且您将显示难以辨认或无意义的数据(问号或无效UTF-8序列的其他指示)。