首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理C语言中的特殊字符(UTF-8编码)

处理C语言中的特殊字符(UTF-8编码)
EN

Stack Overflow用户
提问于 2009-09-03 13:39:01
回答 3查看 22.8K关注 0票数 18

我正在用C语言编写一个小应用程序,它读取一个简单的文本文件,然后逐行输出。问题是文本文件中包含一些特殊字符,如?、?和?等。当我在终端中运行程序时,这些字符的输出用"?“表示。

有没有简单的解决办法?

EN

回答 3

Stack Overflow用户

发布于 2009-09-03 13:40:48

确保没有意外地丢弃任何字节;一些UTF-8字符的长度超过一个字节(这就是问题的关键所在),您需要将它们全部保留下来。

将缓冲区的内容打印为十六进制非常有用,这样您就可以检查实际读取了哪些字节:

代码语言:javascript
复制
static void print_buffer(const char *buffer, size_t length)
{
  size_t i;

  for(i = 0; i < length; i++)
    printf("%02x ", (unsigned int) buffer[i]);
  putchar('\n');
}

您可以在加载一个非常短的文件后执行此操作,该文件只包含几个字符。

还要确保终端设置为正确的编码,以便它将字符解释为UTF-8。

票数 3
EN

Stack Overflow用户

发布于 2009-09-03 13:56:05

您的文本文件可能是ISO-8559-1编码的,但是您的终端是UTF-8。在处理面向字节的文本处理时,这种不匹配是一个标准问题;其他C程序(如标准的‘cat’和‘more’命令)也会做同样的事情,通常不认为这是一个错误或需要修复的东西。

如果您希望在Unicode字符级别而不是字节级别进行操作,这是可以的,但是您需要在整个程序中使用wchar而不是char作为字符类型,并为用户提供开关以指定传入的文件编码实际是什么。(虽然有时可以猜测,但它不是很可靠。)

票数 2
EN

Stack Overflow用户

发布于 2009-09-03 14:13:13

我不知道它是否有帮助,但如果您确定终端和输入文件的编码是相同的,您可以尝试setlocale()

代码语言:javascript
复制
#include <locale.h>
…
setlocale(LC_CTYPE, "");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1373463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档