C中putchar的字符集
Charset of putchar in C
我想知道 putchar 使用的是什么字符集。貌似不能打印多字节字符:
putchar('€') //gcc warning: multi-character character constant
但是当Windows中的终端代码页设置为1252(西欧拉丁语),chcp 1252时,下面的代码可以打印欧元符号:
putchar(128)
但是,即使终端的字符集设置为 1252,putchar('€') 也无法打印欧元符号。
任何人都可以向我解释以上(看似)的差异吗?
非常感谢。
char
在 C 中的所有实际目的意味着 "byte",而不是 "character"
您的源文件很可能采用 UTF-8 编码,其中欧元符号编码为以下 3 个字节:0xE2 0x82 0xAC。
putchar
,顾名思义,写入单个字节。 C 作为一种语言没有 "characters" 或 "encodings" 的概念,GCC 默认使用它在源文件中找到的确切字节。因此,在您的情况下,它会向标准输出打印一个字节 0xAC('€'
的最低有效字节)。它在您的编辑器中看起来如何或文件应该是什么编码并不重要。 GCC 不区分大小写,它按原样复制字节。
给定来自程序的字节流,终端显示的内容完全取决于该终端的设置。如果你想在Windows终端显示UTF-8编码的文本,你应该输入chcp 65001
并将字体更改为Lucida。
既然你的编辑器是按照指定的编码显示字节,而终端是使用某种编码显示相同的字节,那么(只要你使用默认设置的GCC或Clang)如果编辑器和终端使用相同的编码,你应该在两个程序中看到相同的字符。
编辑: 关于 GCC 如何处理编码的几点评论:
有两个选项:-finput-charset
和-fexec-charset
。仅当这两个选项相同时,GCC 才会按字面意思处理窄字符串和字符文字中的字节。如果不是,GCC 会将它们从输入编码转换为执行编码。
经过一些测试后,我得出结论,出于某种原因,您的 GCC 运行s 使用 Windows-1250 作为输入编码,UTF-8 作为执行编码。
如果您想真正确定您使用的是正确的编码,请将 -finput-charset=cp1250 -fexec-charset=cp1250
添加到编译器选项。
此外,如果您愿意,您可以通过这种方式使您的程序 运行 使用控制台的默认编码。
我想知道 putchar 使用的是什么字符集。貌似不能打印多字节字符:
putchar('€') //gcc warning: multi-character character constant
但是当Windows中的终端代码页设置为1252(西欧拉丁语),chcp 1252时,下面的代码可以打印欧元符号:
putchar(128)
但是,即使终端的字符集设置为 1252,putchar('€') 也无法打印欧元符号。
任何人都可以向我解释以上(看似)的差异吗?
非常感谢。
char
在 C 中的所有实际目的意味着 "byte",而不是 "character"
您的源文件很可能采用 UTF-8 编码,其中欧元符号编码为以下 3 个字节:0xE2 0x82 0xAC。
putchar
,顾名思义,写入单个字节。 C 作为一种语言没有 "characters" 或 "encodings" 的概念,GCC 默认使用它在源文件中找到的确切字节。因此,在您的情况下,它会向标准输出打印一个字节 0xAC('€'
的最低有效字节)。它在您的编辑器中看起来如何或文件应该是什么编码并不重要。 GCC 不区分大小写,它按原样复制字节。
给定来自程序的字节流,终端显示的内容完全取决于该终端的设置。如果你想在Windows终端显示UTF-8编码的文本,你应该输入chcp 65001
并将字体更改为Lucida。
既然你的编辑器是按照指定的编码显示字节,而终端是使用某种编码显示相同的字节,那么(只要你使用默认设置的GCC或Clang)如果编辑器和终端使用相同的编码,你应该在两个程序中看到相同的字符。
编辑: 关于 GCC 如何处理编码的几点评论:
有两个选项:-finput-charset
和-fexec-charset
。仅当这两个选项相同时,GCC 才会按字面意思处理窄字符串和字符文字中的字节。如果不是,GCC 会将它们从输入编码转换为执行编码。
经过一些测试后,我得出结论,出于某种原因,您的 GCC 运行s 使用 Windows-1250 作为输入编码,UTF-8 作为执行编码。
如果您想真正确定您使用的是正确的编码,请将 -finput-charset=cp1250 -fexec-charset=cp1250
添加到编译器选项。
此外,如果您愿意,您可以通过这种方式使您的程序 运行 使用控制台的默认编码。