C深入理解编程中的字符编码 c语言中字符串的各种指令

所谓字符编码方案 , 就是把要编码的符号按顺序编号 , 统一用一个序号表示 。当然 , 编码时会适当考虑分类原则 , 即尽量把同类字符放在一起 , 以相同的二进制开头 。比如ASCII的a-b分别对应十进制序列号:97-122 , 97的二进制是0110001 。
对于字符的数据表示 , 使用编码方案(字符用序列号编码) , 对于字符的输出 , 通常用点阵图形输出 。对于输入 , 英文比较简单 , 按键盘就可以输入 , 而中文不能直接用编码方案的序号来输入 , 因为不够直观 , 不方便记忆和操作 。因此 , 出现了不同的输入方案 , 如吴彼和拼音 。储物呢?简单的方法当然是存储编码所需的最大字节数(序列号) , 但是对于需要多个字节的编码方案 , 前面部分存储编码(序列号)显然不需要最大字节数 , 所以对于多字节编码方案 , 往往会按照一定的规则创建另一套存储方案 , 然后根据规则进行适当的转换 。这是一种随时间变化空的做法 。
1 ASCII因为计算机最早是美国人发明的 , 而且美国人用的符号比较少 , 一个字节(8位 , 0-11111111)就够了 。这是ASCII码 , 包括大小英文字母 , 数字 , 还有一些可打印或不可打印的符号 , 总共128:

C深入理解编程中的字符编码 c语言中字符串的各种指令


2 GB2312中国使用的汉字有几万个 , 常用汉字也有几千个 。一个字节远远不够 。(两个16位字节(0x0-0xffff)理论上可以表示2 ^ 16 = 65536个字符 。)编码需要兼容ASCII , 易于使用 。
2.1兼容ASCII 。
2.2将我们添加的字节映射为两个大于127的字节(确保两个字节的最高有效位都是1);
【C深入理解编程中的字符编码 c语言中字符串的各种指令】2.3如果发现最高位是0 , 那么就可以确定这个字节映射到ASCII字符 , 那么就只读取一个字节 , 然后查找ASCII表 , 解析成ASCII表对应的字符 。如果发现最高位是1 , 则可以确定该字节映射到GB2312的字符 。然后连续读取两个字节 , 再查GB2312 , 然后解析成对应的字符 。
2.4 ASCII重映射ASCII的两个字节 , 称为全角字符 , 而自身ASCII的一个字节映射的字符称为半角字符 。
2.5之后加入了一些字符形成GBK , 然后加入了一些字符形成GB18030 , 都是向前兼容的 。
2.6 ANSI在不同的操作系统中对应不同的字符码 , 比如简体中文操作系统对应GB2312 , 繁体对应Big5 , 日文操作系统对应JIS 。
GB 2312标准包含6763个汉字 , 其中一级汉字3755个 , 二级汉字3008个 。同时 , GB 2312包含拉丁字母、希腊字母、日语平假名和片假名字母、俄语西里尔字母等682个全角字符 。
GB 2312的出现基本满足了计算机处理汉字的需要 , 其汉字已经覆盖了中国大陆99.75%的使用频率 。
GB 2312无法处理姓名和古文中的生僻字 , 导致了GBK和GB 18030汉字字符集的出现 。
GB 2312以代码0xA1A0开头(10100001 10100000):
C深入理解编程中的字符编码 c语言中字符串的各种指令


3 unicode如果每个国家都有自己的一套字符编码方案 , 自然会给信息交流带来不便 。因此 , 国际标准化组织制定了统一的unicode字符编码方案 , 尽可能地包含所有国家使用的字符 。

推荐阅读