admin 管理员组

文章数量: 887021

************************************************************************************************************
************************************************************************************************************************************************************************************************************************
 
关于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的调用小做总结
 
 

   
 

              
            
            

本文标签: unicode ASCII