在char中存储Unicode

时间:2016-01-08 13:16:55

标签: c unicode char

我有一个程序来测试终端的I / O:

#include <stdio.h>
int main()
{
    char *input[100];
    scanf("%s", input);
    printf("%s", input);
    return 0;

}

它与ASCII字符一样工作,但它也适用于Unicode字符和表情符号。

为什么会这样?

3 个答案:

答案 0 :(得分:3)

您的代码有效,因为输入和输出流具有相同的编码,并且您不对c执行任何操作。

基本上,你键入一些东西,然后转换成一个字节序列,然后存储在c中,然后你将bytes的序列发送回stdout转换它们回到可读的角色。

只要编码和解码过程兼容,您就会得到&#34;期望的&#34;结果

现在,如果您尝试使用标准&#34;字符串&#34;会发生什么? C功能?我们假设您输入了&#34;♠您好&#34;在您的终端中,您将获得预期的输出但是:

strlen(c) -> 8
c[0] -> Some strange character
c[3] -> H
你知道吗?您可以在char数组中存储您想要的任何内容,但这并不意味着您应该这样做。如果要处理扩展字符集,请改用wchar_t

答案 1 :(得分:1)

您可能在Linux上运行,终端设置为UTF-8,因此scanf生成UTF-8,printf可以输出它。 UTF-8的设计使char[]可以存储它。我明确使用char[]而不是char,因为非ASCII字符需要多个字节。

答案 2 :(得分:1)

您的程序未定义,因为它有未定义的行为。

scanf("%s", input);

需要指向字符串的指针,但是

char *input[100];

input是指向charchar *的指针。

您的程序可能有效,因为您传递给scanf的缓冲区大小足以存储unicode字符,并且您传递的字符之间没有NULL字节,但它可能无法正常工作,因为C的实现在你的(和任何其他)机器上允许在UB的情况下做任何事情。