c - Unicode 存储在 C 字符中

标签 c unicode ascii

我现在在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/

相关文章:

java - 使用 Java 的 C 语法检查器

c - 如何使用 Code::Blocks IDE 构建 .lib 文件

java - 在 Windows 控制台中从 Java 代码问题打印出 unicode

html - 如何解码 HTML 实体?

c++ - C和C++的编译区别

python - TypeError: &: 'unicode' 和 'unicode' 不支持的操作数类型

MySQL UTF/Unicode 迁移技巧

javascript - 如何从 JavaScript 中的 ASCII 值创建字符串或字符?

python - 将二进制转换为 ASCII,反之亦然

c - 我如何在 C 中表示位信息?