************************************************************************************************************
************************************************************************************************************************************************************************************************************************
关于ascii与Unicode之间的爱情故事再次就不多讲了....http://blog.csdn/u011605971/article/details/46330087
关于字符的深入解析:
//前言:以前初学C语言的时候觉得Widechar比较麻烦,比较讨厌
//一直不怎么喜欢,但是直到在写Win32时,苦于没用过运行时库处理WCHAR,自己写,一把辛酸泪
//得来太容易,往往不知道珍惜,不懂其中的真意
//对于封装库亦有相同的感受
1.从字符的底结构分类讲起:
.1:ASCII
Begin:
ASCII:American Standard Code for Information Interchange
length:one byte
1981年IBM PC ROM256个字符的字符集,即IBM扩展字符集,扩展ASCII不再是国际标准。
[
[扫描码]
ESC键VK_ESCAPE (27)
回车键:VK_RETURN (13)
TAB键:VK_TAB (9)
Caps Lock键:VK_CAPITAL (20)
Shift键:VK_SHIFT (16)
Ctrl键:VK_CONTROL (17)
Alt键:VK_MENU (18)
空格键:VK_SPACE (32)
退格键:VK_BACK (8)
左徽标键:VK_LWIN (91)
右徽标键:VK_RWIN (92)
鼠标右键快捷键:VK_APPS (93)
Insert键:VK_INSERT (45)
Home键:VK_HOME (36)
Page Up:VK_PRIOR (33)
PageDown:VK_NEXT (34)
End键:VK_END (35)
Delete键:VK_DELETE (46)
方向键(←):VK_LEFT (37)
方向键(↑):VK_UP (38)
方向键(→):VK_RIGHT (39)
方向键(↓):VK_DOWN (40)
F1键:VK_F1 (112)
F2键:VK_F2 (113)
F3键:VK_F3 (114)
F4键:VK_F4 (115)
F5键:VK_F5 (116)
F6键:VK_F6 (117)
F7键:VK_F7 (118)
F8键:VK_F8 (119)
F9键:VK_F9 (120)
F10键:VK_F10 (121)
F11键:VK_F11 (122)
F12键:VK_F12 (123)
Num Lock键:VK_NUMLOCK (144)
小键盘0:VK_NUMPAD0 (96)
小键盘1:VK_NUMPAD1 (97)
小键盘2:VK_NUMPAD2 (98)
小键盘3:VK_NUMPAD3 (99)
小键盘4:VK_NUMPAD4 (100)
小键盘5:VK_NUMPAD5 (101)
小键盘6:VK_NUMPAD6 (102)
小键盘7:VK_NUMPAD7 (103)
小键盘8:VK_NUMPAD8 (104)
小键盘9:VK_NUMPAD9 (105)
小键盘。:VK_DECIMAL (110)
小键盘*:VK_MULTIPLY (106)
小键盘+:VK_ADD (107)
小键盘-:VK_SUBTRACT (109)
小键盘/:VK_DIVIDE (111)
Pause Break键:VK_PAUSE (19)
Scroll Lock键:VK_SCROLL (145)
]
End
上述的编码应该都是ascII
************************************************************************************************************
************************************************************************************************************
Unicode(UCS-2):(ISO取的名字叫UCS(Universal Character Set),Unicode取的名字就叫unicode了.)
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。
目前的Unicode字符分为17组编排,0x0000 至 0xFFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。
然而目前只用了少数平面。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
UCS Transfer Format
UTF-8、utf16、utf32是Unicode的实现方式之一。
简单来说:
Unicode 是「字符集」
UTF-8 是「编码规则」
一个从ID到[编码]映射
Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。
字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……
Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。
【
utf8规则:
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
1.对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2.对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
】
UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节:
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
根据上表中的编码规则,之前的「知」字的码位 U+77E5 属于第三行的范围:
7 7 E 5
0111 0111 1110 0101 二进制的 77E5
--------------------------
0111 011111 100101 二进制的 77E5
1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)
11100111 10011111 10100101 代入模版
E 7 9 F A 5
这就是将 U+77E5 按照 UTF-8 编码为字节序列 E79FA5 的过程。反之亦然。
ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。
Unicode版本2
前面说的都是unicode的第一个版本.但65536显然不算太多的数字,用它来表示常用的字符是没一点问题.足够了,但如果加上很多特殊的就也不够了.于是从1996年开始又来了第二个版本.用四个字节表示所有字符.这样就出现了UTF-8,UTF16,UTF-32.原理和之前肯定是完全一样的,UTF-32就是把所有的字符都用32bit也就是4个字节来表示.然后UTF-8,UTF-16就视情况而定了.UTF-8可以选择1至8个字节中的任一个来表示.而UTF-16只能是选两字节或四字节..由于unicode版本2的原理完全是一样的,就不多说了.
前面说了要知道具体是哪种编码方式,需要判断文本开头的标志,下面是所有编码对应的开头标志
关于little endian与big endian和内存的大端法小端法具有类似的原理(都是存储上的问题)
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
其中的UCS就是前面说的ISO制定的标准,和Unicode是完全一样的,只不过名字不一样.ucs-2对应utf-16,ucs-4对应UTF-32.UTF-8是没有对应的UCS
************************************************************************************************************
************************************************************************************************************
汉字编码:
{
国标码:GB2312—1980
该编码中,共收录汉字和图形符号7445个,其中一级常用汉字3755个(按汉语拼音字母顺序排列),
二级常用汉字3008个(按部首顺序排列),图形符号682个。
GB2312—1980
全部国标汉字及符号组成一个94×94的矩阵。在此矩阵中,每 一行称为一个“区”,每一列称为一个“位”。
于是构成了一个有94个区(01~94区),每个 区有94个位(01~94个位)的汉字字符集。区码与位码组合在
一起就形成了“区位码”,唯 一地确定某一汉字或符号。
【
1)01~09区:图形符号区。
2)10b15区:自定义符号区。
3)16~55区:一级汉字区,按汉字拼音排序,同音字按笔画顺序。
4)56~87区:二级汉字区,按偏旁部首、笔画排序。
5)88~94区:自定义汉字区。
//如此有规律的编码使得如搜狗等打字软件能够方便索引
】
汉字输入码:所谓汉字输入码就是用于使用西文键盘输入汉字的编码。每个汉字对应一组由键盘符号 组成的编码,不同的
汉字输入法其输入码不同。汉字输入码也称外码
【
1)数码:用数字组成的等长编码,典型代表有区位码、电报码。
2)音码:根据汉字的读音组成的编码,典型代表有全拼码和双拼码。
3)形码:根据汉字的形状、结构特征组成的编码,典型代表有五笔字型、表形码。
4)音形码:将汉字读音与其结构特征综合考虑的编码,典型代表有自然码、首尾拼音码。
】。
汉字的内码:
无论用户用哪种输入法,汉字输入到计算机后都转换成汉字内码进行存储,以方便机内 的汉字处理。
汉字内码是采用双字节的变形国标码,
在每个字节的低7位与国标码相同,每个 字节的最高位为1,以与ASCII码字符编码区别。
汉字字形码:
汉字字形码(汉字输出码)是将点阵组成的汉字模型数字化,形成一串二进制数称为汉 字字形码,其
主要用于输出汉字。输出汉字时,将汉字字形码再还原为由点阵构成的汉字,所 以汉字字形码又被称为汉字输出码。
//将点阵字数字化以便于进行对字的style进行变化。
//所谓的字符编码不过是对字符的一种从编号到可视的映射
}
在后面会对字符进行操作的函数(运行时库)和系统API的调用小做总结
发布评论