在C中的putchar字符集

时间:2015-02-17 08:32:23

标签: c character-encoding putchar

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

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

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

putchar(128)

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

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

C中的{p> char用于所有实际目的意味着“字节”,而不是“字符”

您的源文件很可能以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会将它们从输入编码转换为exec编码。

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

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

此外,这样您可以根据需要使程序以控制台的默认编码运行。

相关问题