1

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

我用低级函数 open() 和 write() 做到了这一点。首先,我将语言环境设置为可识别 utf-8 的字符集,使用 setlocale("LC_ALL", "de_DE.utf8"). 但生成的文件不包含 utf-8 字符,仅包含 iso8859 编码的变音符号。我究竟做错了什么?

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

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

4

3 回答 3

2

更改语言环境不会更改使用 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

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

问候,

于 2009-02-09T22:23:03.230 回答
1

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

寻找以 mb 为前缀的函数,以及以 wc 为前缀的函数,用于从多字节转换为宽字符。您必须首先使用 setlocale() 将语言环境设置为 UTF-8,以便它选择这种多字节支持的实现。

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

于 2009-02-09T22:41:01.957 回答
0

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

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

于 2009-02-09T22:22:52.203 回答