Linux和C语言编程:如何将utf-8编码的文本写入文件?

我有兴趣将utf-8编码的string写入文件。

我用低级函数open()和write()来做这个。 首先,我使用setlocale("LC_ALL", "de_DE.utf8")将区域设置为utf-8知道的字符集。 但是生成的文件不包含utf-8字符,只有iso8859编码的变音符号。 我究竟做错了什么?

附录:我不知道我的string是否真的是UTF-8编码。 我只是把它们保存在这个源文件中: char *msg = "Rote Grütze";

查看文本文件内容的屏幕截图: alt text http://img19.imageshack.us/img19/9791/picture1jh9.png

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

编辑问题之后编辑 :UTF-8字符仅在“特殊”符号(ümlauts,çccénts等)中与ISO-8859不同。 所以,对于所有没有这个符号的文本,两者都是等价的。 但是,如果您在程序字符串中包含这些符号,则必须确保文本编辑器将数据视为UTF-8。 有时你只需告诉它。

综上所述,如果源代码中的字符串是UTF-8,那么您生成的文本将以UTF-8编码。

另一个编辑 :只要可以肯定,你可以使用iconv将你的源代码转换为UTF-8:

 iconv -f latin1 -t utf8 file.c 

这将把所有的拉丁字符串转换为utf8,当你打印它们时,它们肯定是UTF-8。 如果iconv遇到一个奇怪的字符,或者你看到输出字符串奇怪的字符,那么你的字符串已经在UTF-8。

问候,

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

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

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

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

一旦你完成了这个,你可以编辑你的原始帖子来添加相关的信息?