Unicode与ASCII

来源:互联网 发布:水经注软件 谷歌 编辑:程序博客网 时间:2024/05/18 05:58
************************************************************************************************************************************************************************************************************************************************************************************************************************************
关于ascii与Unicode之间的爱情故事再次就不多讲了....http://blog.csdn.net/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的调用小做总结


原创粉丝点击