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 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726379714h948757.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论