Skip to content

LV015-编码

一、源文件编码

上边了解了 C 语言中字符的编码,源文件也是存储在计算机中的,那源文件是什么编码呢?源文件最终会被存储到本地硬盘,或者远程服务器,这个时候就要尽量压缩文件体积,以节省硬盘空间或者网络流量,而代码中大部分的字符都是 ASCII 编码中的字符,用一个字节足以容纳,所以 UTF-8 编码是一个不错的选择。

UTF-8 兼容 ASCII ,并且 UTF-8 基于 Unicode ,支持全世界的字符。常见的 IDE 或者编辑器,例如 Xcode 、 Gedit 、 Vim 等,在创建源文件时一般也默认使用 UTF-8 编码。

还有一种是本地编码,所谓本地编码就是像 GBK 、 Big5 、 Shift-JIS 等这样的国家编码(地区编码);针对不同国家发行的操作系统,默认的本地编码一般不同。简体中文版本的 Windows 默认的本地编码是 GBK 。 Visual Studio 就默认使用本地编码来创建源文件。

对于编译器来说,它往往支持多种编码格式的源文件。微软编译器、 GCC 、 LLVM/Clang (内嵌于 Xcode 中)都支持 UTF-8 和本地编码的源文件,微软编译器还支持 UTF-16 编码的源文件。如果考虑到源文件的通用性,就只能使用 UTF-8 和本地编码了。

二、常见编码方式

1. ASCII 码

前边介绍过了,它总共有 128 个,主要是用于窄字符的编码。

2. ISO-8859-1

ISO 组织在 ASCII 码基础上制定了一些列标准用来扩展 ASCII 编码,它们是 ISO-8859-1~ISO-8859-15 ,其中 ISO-8859-1 涵盖了大多数西欧语言字符,所有应用的最广泛。 ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。

3. GB2312

全称是《信息交换用汉字编码字符集 基本集》,它是 双字节编码,总的编码范围是 A1-F7 ,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。

4. GBK

全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312 ,加入更多的汉字。

它的编码范围是 8140~FEFE (去掉 XX7F )总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的。

5. GB18030

全称是《信息交换用汉字编码字符集》,是我国的强制标准,它可能是单字节、双字节或者四字节编码,它的编码与 GB2312 编码兼容。

6. Unicode 字符集

前边也大致介绍了一下,这与 ASCII 很类似, Unicode 相当于一本很厚的字典,记录着世界上所有字符对应的一个数字。

仅仅只是一个字符集,规定了符合对应的二进制代码,至于这个二进制代码如何存储则没有任何规定。

7. UTF-16

UTF-16 具体定义了 Unicode 字符在计算机中存取方法。 UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长的表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit ,所以叫 UTF-16 。

UTF-16 表示字符非常方便,每两个字节表示一个字符,这样在字符串操作时就大大简化了操作。

8. UTF-8

UTF-16 统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是有很大一部分字符用一个字节就可以表示的现,这样存储空间放大了一倍,珍贵的内存空间就被浪费掉了。

UTF-8 全称 8bit Unicode Transformation Format , 8 比特的 Unicode 通用转换格式。它采用了一种变长技术, 每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。 编码规则如下:

  • 对于单字节的符号, 字节的第一位(最高位,也就是第 8 位)设为 0 , 后面 7 位为这个符号的 unicode 码. 因此对于英语字母, 来说, UTF-8 编码和 ASCII 码是相同的.

  • 对于 n 字节的符号( n > 1 ), 第一个字节的前 n 位都设为 1 ,第 n+1 位设为 0 ,后面剩余的 n - 1 个字节的前两位一律设为 10 。剩下的二进制位, 全部为这个符号的 Unicode 码.

n Unicode 十六进制码范围 UTF-8 二进制
1 0000 0000 - 0000 007F 0xxxxxxx
2 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
3 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
4 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 0020 0000 - 03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 0400 0000 - 7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
【注意】在 UTF-8 编码中,英文字符占一个字节,中文字符占用 3 个字节。