【GCC】文件保存/读入/编译时文字编/解码处理

目录

  • 一、-finput-charset= 选项
  • 二、-fexec-charset= 选项
  • 三、总结

gcc 版本4.6.3
运行环境Linux 3.5.0 (Ubuntu 12.04.2 LTS)
文件二进制查看工具WinHex
编码在线转换:http://www.mytju.com/classcode/tools/encode_utf8.asp

一、-finput-charset= 选项

当点击保存的时候,中文在内存中的保存形式同英文一样都需要对其进行编码,常见的编码方式有 GB2312GBKBig5UTF-8 等,保存的时候编辑器一般有默认的中文编码方式,当用另外一个软件打开的时候需要指定好中文对应的编码方式,不然就会出现乱码的情况,比如,Visual Studio 2019 敲的中文注释,在 Visual Studio Code 打开就会出现乱码。

有些软件在保存的时候是支持选用编码格式的,比如 Windows 自带的文本编辑器。文件 —> 另存为 ——> 此时就出现了编码的选项。

【GCC】文件保存/读入/编译时文字编/解码处理_第1张图片

当我们用 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

【GCC】文件保存/读入/编译时文字编/解码处理_第2张图片

所以存在这么一种情况,当 vimUTF-8 编码保存,然后在编译的时候加入 -finput-charset=GBK,则 GCC 会UTF-8 编码值当成 GBK 来看待,然后将 GBK 编码值转换成 UTF-8 (可执行代码的编码格式,可通过 -fexec-charset= 选项指定)。

通过上面的测试代码做一个举例,编译:gcc -finput-charset=GBK -E 1.c -o 1.s

【GCC】文件保存/读入/编译时文字编/解码处理_第3张图片
1.s 文件如上所示,方框中的数据转换过程如下:

  1. “你好” 的 UTF-8 编码的八进制为:\344\275\240 (你)\345\245\275 (好),十六进制依次为0xE40xBD0xA00xE50xA50xBD

  2. GBK 编码为 2 个字节,将 UTF-8 当成 GBK 看待,所以依次为 0xE4BD0xA0E50xA5BD

  3. GBK 编码值 0xE4BD 的字符为 “浣”,这个字符所对应的 UTF-8 编码值为 0xE6B5A3(\346\265\243),这就是转换完成的结果,其余字符依次按这样的方式转换。

二、-fexec-charset= 选项

-fexec-charset=GBK:设置编译出的可执行程序中的字符是 GBK 编码。

【GCC】文件保存/读入/编译时文字编/解码处理_第4张图片
转换过程同上述的一致,只是上面需要完成 GBK 转换为 UTF-8,这里由于选项 -fexec-charset= 的作用,将 GBK 转换为 GBK,所以保持不变。

三、总结

GCC 编译的时候,首先需要指定源代码的解读方式(默认为 UTF-8 ),然后根据编译成可执行文件的编码方式(默认为 UTF-8 ),将输入的源代码的编码值转换为可执行文件所指定编码方式的编码值。

如理解有误,望不吝指正。

参考:
[1]: 在Vim中查看文件编码和文件编码转换
[2]: vim中查看和修改文件编码格式
[3]: 嵌入式Linux_Framebuffer_04点阵显示汉字的方法

你可能感兴趣的:(编译,vim,linux,编辑器)