gcc 版本:4.6.3
运行环境:Linux 3.5.0 (Ubuntu 12.04.2 LTS)
文件二进制查看工具:WinHex
编码在线转换:http://www.mytju.com/classcode/tools/encode_utf8.asp
当点击保存的时候,中文在内存中的保存形式同英文一样都需要对其进行编码,常见的编码方式有 GB2312
、GBK
、Big5
、UTF-8
等,保存的时候编辑器一般有默认的中文编码方式,当用另外一个软件打开的时候需要指定好中文对应的编码方式,不然就会出现乱码的情况,比如,Visual Studio 2019
敲的中文注释,在 Visual Studio Code
打开就会出现乱码。
有些软件在保存的时候是支持选用编码格式的,比如 Windows
自带的文本编辑器。文件 —> 另存为 ——> 此时就出现了编码的选项。
当我们用 vim
编辑器点击保存的时候使用时,默认使用的是 UTF-8
。
查看文件编码格式:
进入 vim 编辑器 ——> 输入:set fileencoding
,回车
测试代码:
/* 1.c */
#include
int main(int argc, const char *argv[])
{
printf("你好\n");
}
通过 WinHex
查看源代码的二进制形式,可以发现与 UTF-8
编码相同。
查看 GCC
官方文档,关于 -finput-charset=
的作用:应该用什么格式解读输入文件,如果没有指定则默认为UTF-8。
所以存在这么一种情况,当 vim
以 UTF-8
编码保存,然后在编译的时候加入 -finput-charset=GBK
,则 GCC 会将 UTF-8
编码值当成 GBK
来看待,然后将 GBK
编码值转换成 UTF-8
(可执行代码的编码格式,可通过 -fexec-charset=
选项指定)。
通过上面的测试代码做一个举例,编译:gcc -finput-charset=GBK -E 1.c -o 1.s
“你好” 的 UTF-8 编码的八进制为:\344\275\240
(你)\345\245\275
(好),十六进制依次为0xE4
、0xBD
、0xA0
、0xE5
、0xA5
、0xBD
。
GBK 编码为 2 个字节,将 UTF-8 当成 GBK 看待,所以依次为 0xE4BD
、0xA0E5
、0xA5BD
。
GBK 编码值 0xE4BD
的字符为 “浣”,这个字符所对应的 UTF-8 编码值为 0xE6B5A3(\346\265\243)
,这就是转换完成的结果,其余字符依次按这样的方式转换。
-fexec-charset=GBK:设置编译出的可执行程序中的字符是 GBK 编码。
转换过程同上述的一致,只是上面需要完成 GBK 转换为 UTF-8,这里由于选项 -fexec-charset=
的作用,将 GBK 转换为 GBK,所以保持不变。
GCC 编译的时候,首先需要指定源代码的解读方式(默认为 UTF-8 ),然后根据编译成可执行文件的编码方式(默认为 UTF-8 ),将输入的源代码的编码值转换为可执行文件所指定编码方式的编码值。
如理解有误,望不吝指正。
参考:
[1]: 在Vim中查看文件编码和文件编码转换
[2]: vim中查看和修改文件编码格式
[3]: 嵌入式Linux_Framebuffer_04点阵显示汉字的方法