我现在在Linux上学习C语言,遇到了一些奇怪的情况。
据我所知,标准 C 的 char
数据类型为 ASCII,1 字节(8 位)。它应该意味着它只能容纳 ASCII 字符。
在我的程序中我使用 char input[]
,由 getchar
填充像这样的伪代码的功能:
char input[20];
int z, i;
for(i = 0; i < 20; i++)
{
z = getchar();
input[i] = z;
}
奇怪的是,它不仅适用于 ASCII 字符,而且适用于我想象的任何字符,例如 @&@{čřžŧ¶'`[łĐŧđж←^€~[←^ø{&}čž
在输入上。
我的问题是 - 这怎么可能?它似乎是 C 中许多美丽的异常(exception)之一,但我真的很感激解释。是操作系统、编译器、隐藏语言的额外 super 特性的问题吗?
谢谢。
最佳答案
这里没有魔法 - C 语言让您可以访问原始字节,因为它们存储在计算机内存中。 如果您的终端正在使用 utf-8(这很可能),则非 ASCII 字符在内存中占用超过一个字节。当您再次显示时,我们的终端代码会将这些序列转换为单个显示字符。
只需更改您的代码以打印字符串的 strlen
,您就会明白我的意思。
要在 C 中正确处理 utf-8 非 ASCII 字符,您必须使用一些库来为您处理它们,例如 glib、qt 或许多其他库。
关于c - Unicode 存储在 C 字符中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017328/