假设我编写以下 C 程序并将其保存在名为 Hello.c 的文本文件中
#include<stdio.h>
int main()
{
printf("Hello there");
return 0;
}
Hello.c
文件可能会以 UTF8 编码格式保存。
现在,我编译此文件以创建一个名为
Hello
的二进制文件
现在,这个二进制文件应该以某种方式存储文本“
Hello there
”。问题是使用什么编码来存储此文本?
源代码中的字符和结果程序中的字符之间的转换是实现定义的。 gcc 提供了命令行选项来控制此行为。其他编译器可能有类似的选项。
来自 https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
-fexec-charset=字符集
设置执行字符集,用于字符串和字符常量。默认为 UTF-8。字符集可以是系统 iconv 库例程支持的任何编码。
-fwide-exec-charset=字符集
设置宽执行字符集,用于宽字符串和字符常量。默认值是 UTF-32BE、UTF-32LE、UTF-16BE 或 UTF-16LE 之一,以对应于 wchar_t 的宽度以及用于代码生成的大端或小端字节顺序。与 -fexec-charset 一样,字符集可以是系统 iconv 库例程支持的任何编码;但是,您可能会遇到与 wchar_t 不完全匹配的编码问题。
-finput-charset=字符集
设置输入字符集,用于从输入文件的字符集转换为GCC使用的源字符集。如果语言环境未指定,或者 GCC 无法从语言环境获取此信息,则默认为 UTF-8。这可以被区域设置或此命令行选项覆盖。目前,如果存在冲突,则命令行选项优先。字符集可以是系统 iconv 库例程支持的任何编码。
您可能还想阅读https://gcc.gnu.org/onlinedocs/cpp/Character-sets.html
一般来说,如果源字符集与编写的源代码不匹配,或者编译器假定的执行字符集与您传递字符串的 API 所期望的字符集不匹配,那么您可能会收到错误或莫吉贝克。
大多数情况下,当您想要/需要使用超出 ASCII 范围的字符时,您必须开始担心这一点。