字符串编码问题(Ascii、Unicode、UCS-2、GBK、UTF-8)
来源:互联网 发布:sqlserver免费吗 编辑:程序博客网 时间:2024/05/16 11:11
1.字符编码的发展
第一阶段:ASCII阶段,(American Standard Code for Information Interchange, “美国信息交换标准码),计算机当时只支持英语,字符在计算机中都是以0和1的方式存储的。象a、b、c、d这样的52个字母(包括大写)、以及0、1、2等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,就必须要有一定的规则,于是美国有关的标准化组织就出台了所谓的ASCII编码,统一规定了上述常用符号用哪个二进制数来表示。(来自百度百科),ASCII码规定每个字符例如“a”使用1个字节来表示,也就是8为的二进制组合,那么就有00000000-11111111一共256种组合,也就是可以表示256个不同的字符。
其中0-31:是控制字符或通讯专用字符(不可以显示的字符,其余为可显示字符),如控制符:LF(换行)、CR(回车)等。
32-126:是字符,其中32是空格。
48-57为0-9的阿拉伯数字。
65-90为26个大写英文字母。
97-122为26个小写英文字母。
其余的是一些标点符号,运算符号等。
ASSCII共计有128个,从0到127,也就是从00000000-01111111,最高位都是0。
第二阶段:ANSI编码(本地化)阶段,ASCII只能表示英文字符,那么其他字符怎么表示呢?汉语是这样解决的,用两个ASCII表示一个汉字,而且不用前面的128个。比如汉字“中”在中文操作系统中使用[0xD6,0xD0] 这两个字节存储,这样每个汉字也都有了自己的编码,汉字编码解决了,这就是中国的GB2312编码标准,但是这是中国汉字的编码,那么其他国家呢?其他的国家的计算机操作系统中可能把[0xD6,0xD0] 这两个字节存储成他们的文字,而不是“中”,不同的国家和地区制定了不同的标准,这些使用 2 个字节来代表一个字符的各种文字延伸编码方式,称为 ANSI 编码。
“大”的国际交换码:(00110100 01110011),内码是:10110100 11110011(B4F3)
第三阶段:UNICODE(国际化),为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
Unicode目前普遍采用的是UCS-2它用两个字节来编码一个字符一般用十六进制来表示UCS-2最多能编码65536个字符
环境:win7中文旗舰版 + VS2010 + 当前代码页为GBK(GBK兼容GB2312,所以上面的例子,可以再当前环境下验证)
string str1 = "123大";//GBK编码[31H,32H,33H,b4H,f3H]wstring str2 = L"123大";//UCS-2编码[0031H,0032H,0033H,5927H]string str3;int nlength = WideCharToMultiByte(CP_UTF8, 0, str2.c_str(), -1, NULL, 0, NULL, NULL);str3.resize(nlength, '\0');WideCharToMultiByte(CP_UTF8, 0, str2.c_str(), -1, &str3[0], nlength, NULL, NULL);//Unicode to UTF-8//str2 UTF-8编码[31H,32H,33H,E5H,a4H,a7H]
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
例如:
“大”字,UCS-2编码为[5927H],即[0101 1001 0010 0111]
对于UTF-8编码来说,[5927H]在0800H~FFFFH之间,应该使用[1110 xxxx 10yy yyyy 10zz zzzz],将[0101 1001 0010 0111]以此填入xxxx yy yyyy zz zzzz部分,得
[1110 0101 1010 0100 1010 0111],即 [e5H a4H a7H]
- 字符串编码问题(Ascii、Unicode、UCS-2、GBK、UTF-8)
- 史上最清晰Unicode/UCS-/UTF-/ISO-/GBK-/ASCII编码关系
- ASCII GBK UNICODE UCS-2 UCS-4 UTF-8 UTF-16 UTF-32 一次说个明白
- 从ASCII、ISO-8859、GB2312、GBK到Unicode的UCS-2、UCS-4、UTF-8、UTF-16、UTF-32
- 关于ASCII、GBK、Unicode、UTF-8编码
- Unicode/UTF-8/GBK/ASCII 编码简介
- 关于编码:ANSI、UNICODE、UTF-8、GB2312、GBK、DBCS、UCS ...
- ASCII/Unicode/UCS/UTF/GB字符编码
- 字符编码问题,UNICODE\UTF-8\UTF-16\UTF-32\UCS\ANSI\GBK\GB2312等乱七八糟的名词
- 字符编码问题,UNICODE\UTF-8\UTF-16\UTF-32\UCS\ANSI\GBK\GB2312等乱七八糟的名词
- unicode Ascii gbk字符集和utf-8 utf-16编码
- C++字符串完全指引 && 字符编码笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian (合集)
- 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, UTF8.(GBK, GB18030, BIG5, UTF-7,UTF-16,UTF-32)
- 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, UTF8.(GBK, GB18030, BIG5, UTF-7,UTF-16,UTF-32)
- 彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, UTF8.(GBK, GB18030, BIG5, UTF-7,UTF-16,UTF-32) .
- UCS-UNICODE-UTF-8编码
- 字符编码笔记:ASCII,ANSI,Unicode(UTF-8、UCS-2)
- Unicode UTF-8 GBK UCS 解析
- 关于冯.诺依曼的八卦
- 背景建模PbModel
- 入职记录
- struts2.x学习笔记 超详细
- 基本的阈值操作
- 字符串编码问题(Ascii、Unicode、UCS-2、GBK、UTF-8)
- 堆的动态创建与根节点删除
- Java中的Timer和TimerTask的用法
- 去掉vim 里打开的^M
- s2sh配置技巧----------------------------OpenSessionInViewFilter
- sdut 1309 区间DP
- J2EE企业级开发攻略
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第四题:史丰收速算(7' )
- java 线程同步--卖票问题