一字符编码 详细介绍
1. 字节 (Byte) 是一种计量单位, 他是计算机信息技术存储容量的一种单位
2. 字符的意义: 字符数计算机文字中使用的文字和符号, 比如 1,2,3,4,~,@,!,%,^ 等待
3. 在不同编码里字符和字节对应的关系不同
a. 在 ASCLL 码中, 一个英文字母 (不区分大小写) 占一个字节(8bit), 一个汉子占两个字节(16bit)
b.UTF-8 编码中, 一个英文字符等于一个字节, 一个中文 (含繁体) 等于三个字节
c. 在 Unicode 编码中, 一个英文两个字节, 一个中文 (含繁体) 占两个字节
d. 英文符号占一个字节, 中文符号占两个字节
4. 多字符集 : 各国文字编码哟重叠的编码 (编码冲突) 导致乱码
a. 最开始, internet 上只有一种字符集 ------ANS 的 ASCLL 字符集, 他用 7bits 表示一个字符,
总共表示 128 个字符, 包括英文字母, 数字, 标点符号, 之后进行扩展, 使用 8bits 表示一个字符
可以表示 256 个字符, 再原来的 7bits 基础上加入了一些特殊字符.
b. 后来各国语音的加入, ASCLL 已经不能满足需求, 各国都在 ASCLL 的基础上制定了自己的
字符集, 这些从 ANSL 标准派生的字符集被习惯的称为 ANSL 字符集
正式名称 MBCS(Multi-Byte Chactacter System, 即多字节字符系统), 每种语言都有自己的字符集
导致各种字符集实在太多, 在国际交流中非常不便, 因此提出了 Unicode 字符集,
它固定使用 16 bits(两个字节一个字)来表示一个字符, 共可以表示 65535 个字符, 将世界上
所有语音常用字符都收录其中,(Unicode 标准称为 UTF-16), 后来为了能使双字节的 Unicode
能够在现存的处理单字节系统上正确传输, 出现了 UTF-8, 使用 MBCS 的方式对 Unicode 进行编码.
UTF-8 是编码, 它属于 Unicode 字符集,
5.Windows 定义了一些数据类型
a.wchar_t 就是两个字节 带有 W 的都是这个类型
b.WCHAR Unicode 字符 他其实就是 wchar_t
c.PWSTR 指向 Unicode 字符串的指针 wchar_t *
d.PCWSTR 指向一个常量的 Unicode const wchar_t *
e. 对应多字节的类型为 CHAR,LPSTR,LPCSTR
f.ASNL/Unicode 通用数据类型,
TCAHR 多字符集中为 char, Unicode 中为 wchar_t
PTSTR 多字符集中为 char *, Unicode 中为 wchar_t *
LPCTSTR 多字符集中为 const char *, Unicode 中为 const wchar_t *
f. 带有 A 就是多字符集, W 就是 Unicode(款字符),T 就是通用的
7.Windows 中多字符集和 Unicode 相互转化的 API
a.WideCharToMultiByte 映射一个 Unicode 字符串到多字节字符串
b.MultiByteToWideChar 映射一个多字节字符串到 Unicode 字符串
8. 函数 使用上面的函数比较复杂 则可以使用下面的宏函数
使用之前要先声明标识符 USES_CONVERSION;
A2W: 将多字节 转 宽字节
- USES_CONVERSION
- CString str;
- char* AChar = "abcdefg";
- wchar_t* WChar = A2W(AChar);
- str = WChar;
W2A: 将款字节 转 多字节
- USES_CONVERSION;
- wchar_t* AChar = L"abcdefg 啊";
- char* WChar = W2A(AChar);
T2A: T 代表跟随系统 转 多字节
- USES_CONVERSION;
- char * pChar="char to cstring";
- CString cTemp=A2T(pChar);
T2W: 系统类型 转 款字节
- SES_CONVERSION;
- CString cTemp =_T("char to cstring");
- char * pChar=A2T(pChar);
9. 谨慎使用上面的宏函数转换
a. 如果你在一个循环里使用这个函数 可能会引起堆栈溢出
因为你查看代码发现他函数里面会调用 alloc 申请内存, 他会在函数的栈中分配,
VC 编译器默认是 2M, 在一个循环中调用这个函数就会一直分配内存.
b. 解决办法最好是使用 WideCharToMultiByte MultiByteToWideChar
这两个 API, 把这两个 API 封装一下, 使用就很方便了.
10. 使用 THAR _TEXT 可以同时适应 Unicode 和多字节字符集
来源: http://www.bubuko.com/infodetail-2546064.html