Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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
C fopen()或open()使用什么字符编码?_C_Linux_Character Encoding - Fatal编程技术网

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

C fopen()或open()使用什么字符编码?,c,linux,character-encoding,C,Linux,Character Encoding,使用类似于fopen()的函数时,必须为文件名传递一个字符串参数。我想知道这个字符串的字符编码应该是什么 这个问题已经被问过了,但答案却自相矛盾。一个答案是: 这取决于系统区域设置。查看“locale”的输出 指挥部。如果变量以UTF-8结尾,那么您的语言环境是UTF-8。 大多数现代linuxes将使用UTF-8。虽然安德鲁是对的 从技术上讲,这只是一个字节字符串,如果您不匹配 系统区域设置某些程序可能无法正常工作,并且将被禁用 无法获得正确的用户输入等。最好坚持使用 UTF-8 另一个答案是

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

这个问题已经被问过了,但答案却自相矛盾。一个答案是:

这取决于系统区域设置。查看“locale”的输出 指挥部。如果变量以UTF-8结尾,那么您的语言环境是UTF-8。 大多数现代linuxes将使用UTF-8。虽然安德鲁是对的 从技术上讲,这只是一个字节字符串,如果您不匹配 系统区域设置某些程序可能无法正常工作,并且将被禁用 无法获得正确的用户输入等。最好坚持使用 UTF-8

另一个答案是:

Linux上的文件系统调用编码不可知,也就是说,它们不是 (需要)了解特定的编码。就他们而言 与此相关,filename参数指向的字节字符串是 按原样传递到文件系统。文件系统期望 文件名采用正确的编码(通常为UTF-8,如 马修·塔尔伯特)

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


哪个答案是正确的?

它们在某些方面都是正确的

传递给文件系统调用的字符串是一个字节字符串,其中一个空字节表示字符串的结尾,而“
/
”用于分隔路径组件。在文件名段中,字节的含义对文件系统来说无关紧要——它们只是一个字节序列


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

您给出的第一个答案显然是错误的。它不依赖于“系统区域设置”。一开始就没有系统语言环境这样的东西。只有用户区域设置。例外是以16位字符存储名称的文件系统;然后,mount选项
iocharset
说明如何将16位字符转换为8位字符序列,反之亦然。(例如,这会影响VFAT上的长文件名。NTFS使用
nls
mount选项来替代它,因为MS所做的任何事情都不是标准的,如果它可以避免的话。)@NominalAnimal:MS在Linux文件系统装载选项的命名中到底是如何参与的?VFAT驱动程序和NTFS3G驱动程序都不是微软的。这更像是“在Linux上,没有两个人在不同的实现中以兼容的方式做同一件事”——只要问问可怜的FreeDesktop家伙,他们试图在混乱中整理一些秩序。@MatteoItalia:不,你错了。NTFS最初使用的是
iocharset
mount选项,但很快就被弃用,取而代之的是
nls
选项。Linux NTFS驱动程序可以同时使用这两个选项,但代码会专门检查
iocharset
以显示弃用错误。与所有其他文件系统一样,使用nls=而不是iocharset=的唯一原因是为了安抚Microsoft,他们在文档中使用“nls”和“codepage”而不是字符集。NTFS开发者似乎对与微软合作比与Linux合作更感兴趣:参见例如历史。(如果有人不清楚,Anton Altaparmakov是Linux NTFS fs驱动程序的维护者。祝你好运,尝试通过任何补丁程序,甚至可以使用iocharset挂载选项,在fs上统一它。不会发生;将以比你能为它编写五行补丁更快的速度被禁用。请尝试。)实际上很有趣,这个选项在2005年之前就已经被弃用了(这是git历史上被指控的代码行的记录),但今天——13年多过去了——它仍然可以正常工作,只是发出了一条恼人的消息;他们对这种批评并没有那么认真。删除这条恼人的消息将真的是一个5行补丁。事实上,我很惊讶没有人打扰,我将尝试询问LKML。我仍然不相信阴谋论,我已经看到了足够多的小争吵认为我们完全有能力自我造成这种伤害是“正确的事情”。