C中putchar的字符集

标签 c character-encoding putchar

我想弄清楚 putchar 使用的是什么字符集。貌似不能打印多字节字符:

putchar('€') //gcc warning: multi-character character constant

但是当 Windows 中的终端代码页设置为 1252(西欧拉丁语)并使用 chcp 1252 时,以下代码能够打印欧元符号:

putchar(128)

但是,即使终端的字符集设置为 1252,putchar('€') 也无法打印欧元符号。

任何人都可以向我解释上述(看似)的差异吗?

非常感谢。

最佳答案

char 在 C 中的所有实用目的都表示“字节”,而不是“字符”

您的源文件很可能采用 UTF-8 编码,其中欧元符号编码为以下 3 个字节:0xE2 0x82 0xAC。

putchar,顾名思义,写入单个字节。 C 作为一种语言没有“字符”或“编码”的概念,GCC 默认使用它在源文件中找到的确切字节。因此,在您的情况下,它会向标准输出打印一个字节 0xAC('€' 的最低有效字节)。它在您的编辑器中看起来如何或文件应该是什么编码并不重要。 GCC 不区分大小写,它按原样复制字节。

给定来自程序的字节流,终端显示什么,完全取决于该终端的设置。如果你想在Windows终端显示UTF-8编码的文本,你应该输入chcp 65001并将字体更改为Lucida。

由于你的编辑器根据指定的编码显示字节,而终端使用某种编码显示相同的字节,那么(只要你使用默认设置的 GCC 或 Clang)如果编辑器和终端使用相同的编码,您应该在两个程序中看到相同的字符。

编辑:关于 GCC 如何处理编码的评论很少:

有两个选项:-finput-charset-fexec-charset。仅当这两个选项相同时,GCC 才会按字面意思处理窄字符串和字 rune 字中的字节。如果不是,GCC 会将它们从输入编码转换为执行编码。

经过一些测试后,我得出结论,出于某种原因,您的 GCC 以 Windows-1250 作为输入编码和 UTF-8 作为 exec 编码运行。

如果您想真正确定您使用的是正确的编码,请将 -finput-charset=cp1250 -fexec-charset=cp1250 添加到编译器选项。

另外,如果您愿意,您可以通过这种方式让您的程序以控制台的默认编码运行。

关于C中putchar的字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557680/

相关文章:

c++ - 为什么 "const int *p is a pointer to a const int"是一个错误的解释却被广泛使用?

c - 尝试为 STM32 构建自定义 micropython 固件时出现问题

c - 使用 putchar 进行整数提升

c - C 编程语言,第 1 章练习 1.10(Getchar 和 Putchar)

python - urllib2 getparam charset 对某些站点返回 None

c - 在这个程序中,字符类型变量如何容纳多个字节?

c - malloc 的问题

c - 指向地址 C 的字符串

使用日语文件名上传的 PHP 文件在数据库中变成损坏的文件名

Java 本地化文件名