【问题标题】:Linux & C-Programming: How can I write utf-8 encoded text to a file?Linux 和 C 编程:如何将 utf-8 编码的文本写入文件?
【发布时间】:2009-02-09 22:19:08
【问题描述】:

我有兴趣将 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

【问题讨论】:

  • 附录2:正如我所写,我在文本中包含了变音符号,即:char *msg = "Rote Grütze"
  • 这个词是“附录”,而不是“附录”。
  • kitenet.net/~joey/code/moreutils 有一个程序 isutf8,您可以使用它来查看文件是否根据 utf8 编码,至少就比特流而言。这可能会帮助您将来查看您的文件是否为 utf8。

标签: c linux encoding locale


【解决方案1】:

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

问候,

【讨论】:

  • 如何在不使用其他库的情况下使用 libc 执行此操作?
  • 嗯,是的,当然。正如我所说,只需使用支持 UTF-8 的编辑器即可。
  • diegosevilla:我的源代码中有变音符号,它们是明确的 iso-8859 编码的。如何强制程序在没有 icu 库的情况下将它们写出 utf-8 编码?
  • 我建议您改为转换源代码。这将使您不必使用另一个库,并且会加快程序速度(无转换)。使用我在答案中写的 iconv。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2011-04-27
      • 2015-05-18
      • 2012-06-10
      • 1970-01-01
      • 2018-06-13
      相关资源
      最近更新 更多