一开始编程时,对于这些编码格式和相互转换一点不了解,后来有时间就学习了一下,总结下来,希望大家能指点指点。
字符编码方式
早期是ANSI多字节边编码,ASCII码(0x00~0x7f),一个字节表示。
针对中文,中国大陆先后出了GB2312(两字节),GBK(两字节),GB18030(两字节或四字节),港澳台则使用大五码 Big5
国际组织制定了Unicode编码,也成万国码,国际码
Unicode编码系统分为编码方式和实现方式
编码方式为UCS-2(两字节),UCS-4(四字节)
实现方式或者转换格式为:
UTF-8:灵活的变长编码,对于 ASCII 使用一个字节编码,其他本地化语言文字用多个字节编码,最长可以到 6 个字节编码一个字符。对于汉字,通常是 3 个字节表示一个汉字。这是 Unix/Linux 系统默认的字符编码
UTF-16:兼容 UCS-2,一般都是两字节表示一个字符,对于超出两字节的国际码字符,使用一对两字节来表示。在存储时,按两个字节的排布顺 序,可以分为 UTF-16LE(Little Endian,小端字节序)和UTF-16BE(Big Endian,大端字节序),微软所说的 Unicode 默认就是 UTF-16LE。
UTF-32:同 UCS-4,因为用四个字节表示一个字符,所以不需要考虑扩展了。这种编码方式简单,但也特别浪费空间,所以应用很少。在存储时也分为 UTF-32BE 和 UTF-32LE,因为用得少,所以不用太关心这种编码格式。
主要是关注utf-8和unicode的关系:
Unicode符号范围 | UTF-8编码
(十六进制) | (二进制)
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
C++使用的字符串
在 C++ 中,以前通常使用 char 表示单字节的字符,使用 wchar_t 表示宽字符,对国际码提供一定程度的支持。 对于宽字符,Windows 系统里是两个字节表示,就是 UTF-16;而 Unix/Linux 系统里为了更全面的国际码支持,其宽字符是四个字节,即 UTF-32 编码。
系统编码格式
在 Windows 系统里最常用的文本字符编码格式是 ANSI (简体是 GBK,繁体是 Big5)和 Unicode (UTF-16LE)格式,Windows 命令行默认的输入输出格式是 ANSI 的。在 Linux 系统里统统都是 UTF-8,几乎不会用到utf-16
各种编码格式转换:
windows下
c++:
不知道为什么代码贴不上去,以后再贴吧,网上都能查到转换的实现
L 和_T
L不管你是以什么方式编译,一律以UNICODE方式保存。
_T是一个适配的宏~
当 #ifdef _UNICODE的时候 _T就是L
没有 #ifdef _UNICODE的时候 _T就是ANSI的。
ATL的转换宏也可实现编码的zhuanhua
USES_CONVERSION;
A2W W2A A2T T2A
使用很简单
c的转换就不写了,上网查一下就知道!!!