Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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编程:如何将utf-8编码文本写入文件?_C_Linux_Encoding_Locale - Fatal编程技术网

Linux&;C编程:如何将utf-8编码文本写入文件?

Linux&;C编程:如何将utf-8编码文本写入文件?,c,linux,encoding,locale,C,Linux,Encoding,Locale,我对将utf-8编码字符串写入文件感兴趣 我是用低级函数open()和write()实现的。 首先,我将区域设置设置为支持utf-8的字符集,并使用 setlocale(“LC\u ALL”、“de\u de.utf8”)。 但生成的文件不包含utf-8字符,仅包含iso8859编码的UMLAUT。我做错了什么 附录:我不知道我的字符串一开始是否真的是utf-8编码的。我只是以这种形式将它们保存在源文件中:char*msg=“Rote Grütze” 有关文本文件的内容,请参见屏幕截图: 能否在

我对将utf-8编码字符串写入文件感兴趣

我是用低级函数open()和write()实现的。 首先,我将区域设置设置为支持utf-8的字符集,并使用
setlocale(“LC\u ALL”、“de\u de.utf8”)
。 但生成的文件不包含utf-8字符,仅包含iso8859编码的UMLAUT。我做错了什么

附录:我不知道我的字符串一开始是否真的是utf-8编码的。我只是以这种形式将它们保存在源文件中:
char*msg=“Rote Grütze”

有关文本文件的内容,请参见屏幕截图:

能否在十六进制编辑器中打开文件,并通过一个简单的输入示例验证写入的字节不是传递给write()的Unicode字符的值。有时,文本编辑器无法确定字符集,并且您的文本编辑器可能假定为ISO8859-1字符集


完成此操作后,是否可以编辑原始帖子以添加相关信息?

更改区域设置不会更改使用write()写入文件的实际数据。您必须实际生成UTF-8字符才能将其写入文件。为此,您可以将库用作

编辑问题后进行编辑:UTF-8字符与ISO-8859中的“特殊”符号(ümlauts、áccénts等)不同。所以,对于所有没有这些符号的文本,它们都是等价的。但是,如果在程序中包含带有这些符号的字符串,则必须确保文本编辑器将数据视为UTF-8。有时候你不得不告诉他

总之,如果源代码中的字符串是UTF-8格式,则生成的文本将是UTF-8格式

另一个编辑:为了确保,您可以使用iconv将源代码转换为UTF-8:

iconv -f latin1 -t utf8 file.c
这将把你所有的拉丁-1字符串转换成utf8,当你打印它们时,它们肯定是UTF-8格式的。如果iconv遇到一个奇怪的字符,或者您看到输出字符串带有奇怪的字符,那么您的字符串已经在UTF-8中了


关于,

是的,你可以用glibc来做。他们称之为多字节而不是UTF-8,因为它可以处理多种编码类型。查看手册的一部分

查找以前缀mb开头的函数,以及以wc前缀开头的函数,用于从多字节转换为宽字符。您必须首先使用setlocale()将区域设置设置为UTF-8,以便它选择此多字节支持的实现


如果您来自Unicode文件,我相信您要查找的函数是wcstombs()。

如何在不使用其他库的情况下使用libc实现这一点?当然可以。正如我所说,只需使用一个支持UTF-8的编辑器即可。diegosevilla:我的源代码中有UMLAUT,它们是最终编写的iso-8859编码的。我如何强制程序在没有icu库的情况下写出utf-8编码的代码?我建议您转换源代码。这将节省您使用另一个库,并将加快程序(无转换)。附录2:正如我在回答中所写,我已经在我的文本中包含了umlauts,即:
char*msg=“Rote Grütze”
这个词是“附录”,而不是“附录”。有一个程序isutf8,可以用来查看文件是否按照utf8编码,至少就比特流而言。这可能会在将来帮助您查看文件是否为utf8。