【发布时间】:2016-04-13 04:39:46
【问题描述】:
我编写了一个程序来从终端测试 I/O:
#include <stdio.h>
int main()
{
char *input[100];
scanf("%s", input);
printf("%s", input);
return 0;
}
它可以正常使用 ASCII 字符,但也可以使用 Unicode 字符和表情符号。
这是为什么?
【问题讨论】:
-
我认为这条线
char* input [100]你的意思是char input [100]。char *和char **’是有区别的 -
@KaiIskratsch:这也取决于the normalization --- NFD、NFC 等。
-
@AndrewHenle:由于 UTF-8 的工作原理,您提出的是非法的 UTF-8。
0x00总是 NUL(这适用于0x00到0x7F范围内的所有内容——它与ASCII 相同)。多字节序列(无论是否开始)总是在>= 0x80范围内。这就是为什么许多古老的 C 程序可以将 UTF-8 视为任何其他编码,以及 C 字符串(以 0 结尾)仍然有效的原因! -
@AndrewHenle:假设 OP 在一个 8 位
char的系统上(这不是一个不合理的假设),这个问题强烈暗示 UTF-8 ---或诸如 UTF-EBCDIC 之类的变体(我怀疑是后者)。请记住,他确实说过 Unicode 字符有效。 -
@AndrewHenle:他提到了表情符号的工作; AFAIK,没有单字节编码(例如 ISO-8859-1)支持这一点。他还在评论中提到他使用 Linux,现在 Linux 使用 UTF-8。