1 源字符集
1.1 源字符集的概念
源字符集: 保存源文件时所使用的字符集。
注意:这里的字符集指的其实是字符编码。因为,一个字符集可能有多种字符编码,比如Unicode字符集中就有UTF-8、UTF-16、UTF-32等。所以,我们保存源文件只指定字符集是不行的,我们需要明确指定具体的字符编码。字符集、字符编码这两个词经常被混用,所以,我们需要根据上下文来判断,字符集到底指的是什么。
1.2 明确源字符集的重要性
C实现在转换源文件时,必须要知道源文件在保存时所使用的字符集(源字符集)。因为,不同的字符集对同一个字符的编码可能是不同的。所以,如果C实现不知道源字符集是哪个,那么,它就无法正确的识别源文件的内容,就更不要说进行语法分析了。
如果源文件中只包含了ASCII字符,那么,在保存源文件时,我们基本上不需要关心源字符集的问题。因为,基本上常见的字符集都是兼容ASCII的(UTF-16和UTF-32不兼容ASCII)。
但是,如果源文件中使用了汉字。那么,在保存源文件时,我们就需要关心一下源字符集的问题了。因为,不同的字符集对同一个汉字的编码可能是不同的。
对于gcc:
Linux下gcc是默认使用UTF-8来读取源文件的(Windows下的gcc默认是GBK编码),而UTF-8也是兼容ASCII的,所以一般情况下是不会出问题的。
当源字符集是GBK的时候,我们需要手动设定gcc读取源文件时使用的字符集:
- gcc 1.c -finput-charset = gbk,gcc 将使用gbk来读取源文件
2 执行字符集
2.1 执行字符集的概念
源文件中的内容,本质上其实就是一堆字符(因为,源文件是一个文本文件)。这些字符组成了声明、语句、函数等等(当然了,计算机是看不懂的)。然后,当源文件被转换为可执行程序以后,这些由字符所组成的源代码,都将被替换为实现了相同功能的机器指令。但是,源文件中的字符串、字符常量等信息文本,并不会被替换为相应的机器指令。因为,它们并不对应某个功能,它们一般是用来打印和输出、传输。所以,它们在可执行文件(程序)中存储的仍然是其所对应的字符编码。
接下来的问题是:字符串、字符常量等信息文本在可执行文件中是按照哪种字符编码来存储的?这是由gcc来决定的:Linux下gcc默认使用UTF-8来存储这些信息文本到可执行文件中。
更改gcc的默认设置:
- gcc 1.c -fexec-charset = gbk(gcc将使用gbk来存储这些信息文本到可执行文件中)
执行字符集: 执行环境所使用的字符集。
2.2 修改执行字符集
执行环境所使用的字符集具体是哪个字符集呢?
我们为什么要关心这个问题呢?因为,如果执行字符集和可执行程序中信息文本所使用的字符集不一致。那么,程序在被执行的时候,程序中的信息文本会被错误的解析。
Linux终端:
- 默认为UTF-8。
- 终端属性中即可修改。
windows控制台:
- 默认为GBK。
- 代码页/内码表 :windows给每个字符集分配了一个编号、比如:GBK–>936、UTF-8–>65001。
- 当前/活动代码页 : 活动代码页为936,就表示当前正在使用的字符集是gbk。
- 查看活动代码页 :chcp。
- 设置活动代码页 :chcp 65001。
注意: 执行字符集 != Linux终端的字符集、windows控制台的字符集(图形化的界面有单独的执行字符集)。