C如何从控制台和文件中读取中文

时间:2014-03-31 06:08:32

标签: c

我正在使用ubuntu 12.04
我想知道如何用C

阅读中文
  setlocale(LC_ALL, "zh_CN.UTF-8");
  scanf("%s", st1);
  for (b = 0; b < max_w;b++)
  {
    printf("%d ", st1[b]);
    if (st1[b] == 0)
        break;
  }

对于这段代码,当我输入英文时,它输出正常,但如果我输入中文,如&#34;的&#34;,则输出

Enter word or sentence (EXIT to break): 的
target char seq :
-25 -102 -124 0

我想知道为什么数组中有负值 此外,我发现&#34;的&#34;的字节使用fscanf读取文件不同于从控制台读取文件。

2 个答案:

答案 0 :(得分:2)

UTF-8使用可变数量的字节对字符进行编码。这就是为什么你看到的符号有三个字节的原因。

graphemica - 的,您可以看到,当您使用UTF-8对其进行编码时,其值为U+7684,转换为E7 9A 84

您可以将每个字节分别打印为整数值。 char类型可能已签名,当它转换为整数时,您也可以获得负数。在你的情况下,这是

  • -25 = E7
  • -102 = 9A
  • -124 = 84

您可以使用%x或无符号整数%u将字节打印为十六进制值,然后您将只看到正数。

您也可以将打印声明更改为

printf("%d ", (unsigned char) st1[b]);

将字节解释为无符号值,并将输出显示为

231 154 132 0

答案 1 :(得分:0)

硬编码特定的区域设置名称不需要(事实上它是有害的)。您可以阅读的字符独立于语言环境的语言(用于消息),任何具有UTF-8编码的语言环境都可以正常工作。

最简单的(但是一旦你试图用它做得太过丑陋)使这项工作的方法是使用宽字符stdio函数(例如getwc)而不是字节导向函数。否则,您可以读取字节,然后使用mbrtowc处理它们。