字符在程序中的关注点:
1. 代码阶段,即编程器认为源码中的中文字符串的字符集, 由编辑环境决定。
2.程序中(运行时的内存中,一般固定一种字符集),由类库接口和编译器决定,
比如 window ; _T 结合编译开关可以自动转成 UNICODE 或 ansi,
比如 QT setCodecForLocale setCodecFor 等函数,可以把代码的字符转换为 QT内部的utf-16。
比如我的xbString 类库,是不固定字符集的( 同时支持 ascii, GB18030, utf-8 , utf-16),每一个对象可以是一种字符集, 当发生字符比较/查找/拼接时,自动转换成一致的字符集。
3.介质:
屏幕输出输出(系统环境字符集),若与程序内存中不一致, 需要转换。
文件输出输入, 与程序内存不一致, 需要转换。
tcp : 服务端/客户端的编码不一致时,必须进行转换,程序必须知道对侧的编码
以上3处是发生乱码的位置,另外也有字符集与操作系统语言环境不相容导致乱码。
字符集,windows 又称代码页, 与操作系统的当前字符集项不匹配时,会显示乱码。
常见的简体中文字符集( windows 代码页 936 )
GB18030 :
1字节 兼容 ascii 字符
2 字节 普通中文 标点符号等
4字节 特殊中文以及少数民族文字等;
GB2312 GBK:都是GB18030的子集
BIG5 : 繁体字,独立体系, 与 GB18030 体系不相容 。
字符编码
1. 字符集对应编码,此时字符集 = 字符编码:
例如: GB18030 , gbk , ansi .... , 其中 ansi 在windows中 等效于操作系统使用的字符集编码 。
2. 通用编码, 基本把世界上的所有语言都编码了:
UTF8: 单个字长度 1/2/3/4/5/6 字节, 0 表示终结。
utf16(unicode): 单个字长度 2/4 字节, 连续2个0 表示终结。
utf32: 没用过,应该是 单个字长度4 字节, 连续4个0 表示终结。