源字符集与执行字符集

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控制台的字符集(图形化的界面有单独的执行字符集)。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值