1

我想弄清楚 putchar 使用什么字符集。看起来,它不能打印多字节字符:

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

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

putchar(128)

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

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

非常感谢你。

4

1 回答 1

1

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 才会按字面意思处理窄字符串和字符文字中的字节。如果不是,GCC 将它们从输入编码转换为执行编码。

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

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

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

于 2015-02-18T10:20:35.320 回答