我正在使用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读取文件不同于从控制台读取文件。
答案 0 :(得分:2)
UTF-8
使用可变数量的字节对字符进行编码。这就是为什么你看到的符号有三个字节的原因。
在graphemica - 的,您可以看到,当您使用UTF-8对其进行编码时,其值为U+7684
,转换为E7
9A
84
。
您可以将每个字节分别打印为整数值。 char
类型可能已签名,当它转换为整数时,您也可以获得负数。在你的情况下,这是
您可以使用%x
或无符号整数%u
将字节打印为十六进制值,然后您将只看到正数。
您也可以将打印声明更改为
printf("%d ", (unsigned char) st1[b]);
将字节解释为无符号值,并将输出显示为
231 154 132 0
答案 1 :(得分:0)
硬编码特定的区域设置名称不需要(事实上它是有害的)。您可以阅读的字符独立于语言环境的语言(用于消息),任何具有UTF-8编码的语言环境都可以正常工作。
最简单的(但是一旦你试图用它做得太过丑陋)使这项工作的方法是使用宽字符stdio函数(例如getwc
)而不是字节导向函数。否则,您可以读取字节,然后使用mbrtowc
处理它们。