Unicode编码
Posted 海枫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unicode编码相关的知识,希望对你有一定的参考价值。
Unicode编码
作者:林海枫
网址:http://blog.csdn.net/linyt/archive/2008/12/08/3477866.aspx
[注]:文章版权为作者所有,欢迎转载,但请完整转载并注明作者和完整地址,请勿用于任何商业用途。
什么是Unicode(统一码)?
不论是什么语言。
本文的Unicode编码就是指Unicode为每个字符分配一个唯一数字这一规则,但并不涉及这任何字符对应数字是如何储存的,它将会在Unicode编码形式方面表述。
1. Unicode简介与历史
Unicode(统 一码 、万国码和单 一码 )是目前为止包含字符文字最多的一种编码方案或字符集,它几乎为全球每种语言文字分配了唯一的字符编码。它由Unicode协会(http://www.unicode.org/)组织进行开发,编码和实现。到目前为止,最新的Unicode标准版本为Unicode5.1, 2008年4月发布。Unicode的出现,使得一直已久的编码问题得以解决,不同语言文字都有唯一的编码,字符间不会造成混乱,以满足跨语言、跨平台进行文转换、处理要求。
Unicode项目始建于1988年,由几个软件公司协作开发而成的单一字符集编码标准(single character set encoding standard),支持全球所有的文字。于1991年1月,Unicode项目形成一个新的组织为Unicode协会(Consortium),负责Unicode的开发,编码和实现和标准和方案,同年8月发布Unicode标准1.0。
无独有偶,一个名为ISO/IEC工作组于1984年成立,开始专注开发国际化字符集,支持全球所有语言的文字。该字符集命名为Universal Character Set(UCS), 并1989年发布UCS标准草案。
这两个组织都致力于构造一种通用的编码方案和实现,但它们的字符集都不能兼容,这样两个标准使人们混乱。ISO/IEC和Unicode协会意识到这一点,1991开始合并这两个标准。合并过程出现一些需要协商的问题,首先是ISO/IEC标准处于草案阶段而Unicode1.0标准已经发布了;还有就是Unicode被设计为统一的16位编码方案,最多可包含 65536个字符,而ISO/IEC标准使用31位编码方案,可包含多达20亿个字符。
2. Unicode编码
计算机历史上最早的编码方案应该是ASCII码,它采用整数[0,127]对字符进行编码。每个ASCII字符数值不超过127,因此采用一个字节就可以储存字符。由此编码空间(codespace)为0到127,ASCII字符集中包含了英文字母、数字、符号和控制字符。
定义:
Codespace(编码空间):给字符集所有字符分配的整数集。
Codepoint(代码):codespace中的任一个数值都称为codepoint
由于ASCII码只能表示全球文字的极少一部分,因此Unicode为了能容纳全球所有语言的文字,必须有一个更大的codespace。在早期Unicode 标准未和ISO/ICE标准合并提时,Unicode使用16位(2字节)整数的codespace。
Unicode编码字符集给每个字符分配了一个整数值,该整数值与Unicode字符集中的字符相对应,该整数有个特别称谓为Unicode scalar values(USVs);并且每个字符的USV和它对应的Codepoint是同一个数值,这里两个术语不进行区分,但后者最为常用。根据Unicode约定,Codepoint以“U+”开始,紧接着它对应的十六进制数表示,若不足四位则以0补齐。如“U+ 0345” , “U+ 10345” 和“U+ 20345” 等等。
在新的Unicode标准中,它的codespace从U+0000到U+10FFFF,空间大小为17*64K。在与ISO/IEC标准的合并过程出现的问题, Unicode提出了平面(Plane)的概念。Unicode把[U+0000, U+10FFFF]空间均等地划分成17块,每块称为一个平面,并以0作为开始编号进行命名。[U+0000, U+FFFF]所在的Plane称为Plane 0, [U+10000, U+1FFFF]所在的plane称为Plane 1, 依次类推。
早期的Unicode使用统一的16位编码,并且能够表示全球所有语言的文字,以及这些字符ISO/IEC字符集对应的字符进一致。早期16位编码字符刚好在Plane 0里面,故Unicode把Plane 0命名为Basic Multilingual Plane(BMP)。余下的Plane 1到Plane 16称为Supplementary Planes。新标准Unicode的很大部分codepoint需要用超过2个节字(这里仅指表示,而非存诸codepoint或它对它的字符),但全球所有语言文字都位于BMP中,它可以满足我们多语言的处理,因此全球语言文字使用2个字节就可以表示了。
到目前为止,并不是每个Codepoint分配给字符的,因此Codespace存在很多“真空”codepoint。具体如下:
1)每个Plane都有两个codepoint为非字符,它们是U+nFFFE和U+nFFFF(这里n表示从0到10的十六进制数)。
2)从U+D800到U+DFFFF共2048个codepoint为非字符。这些codepoint之所以不分配,是这些数值会由UTF-16 实现来使用,以免传输和储存过程出现冲突。
3)从标准TUS 3.1开始,Unicode保留32个字符U+FDD0..U+FDEF为非字符,便于程序用于特殊用途。
在17个plane中,一共包含1114112个codepoint。除去66个(2*17+32)为非字符, 2048个保留字符,Unicode space一共包含了1111988个可分配字符。
3. Unicode Planes结构与内容
Unicode字符集可以根据多种方式分类,但Unicode codespace逻辑上被划分成17个Plane, 每个Plane包含65536(2^16)个codepoint, 尽管如此,仍然只有少量的Plane被使用。当前Plane的划分和使用情况如下:
1)Plane 0(U+0000-U+FFFF)
命名为基本多文平面(Basic Multilingual Plane, BMP)。从目前来说,Unicode分配的所有字符中,大部分字符都位于MBP。它包含了早期Unicode(合并前)所分配的字符和全球当前所有语言使用的书写文字。
2)Plane 1(U+10000-U+1FFFF)
命名为辅助多文平面(Supplementary Multilingual Plane, SMP)。
3)Plane 2 (U+20000-U+2FFFF)
命名为表意文字补充平面(Supplementary Ideographic Plane, SIP)。
4)Planes 3 to 13(U+30000-U+DFFFF)
保留,未分配。
5)Plane 14 (U+E0000-U+EFFFF)
命名为特殊用途补充平面(Supplementray Special-purpose Plane, SSP)。
6) Plane 15 (U+F0000-U+FFFFF)
命名为私有使用区(Private Use Area, PUA)
7) Plane 16 (U+100000-U10FFFF)
命名为私有使用区(Private User Area, PUA),保留。
3.1 基本多文平面(BMP)
Unicode中第一个平面,通常称为基本多文平面(Basic Multilingual Plane, BMP), 它几乎包含了所有现代语言文字和大量特殊字符;此中很大部分分配给中文、日文和韩文文字(称为CJK)。在Unicode 5.1标准中,BMP所包含的字符如下:
· Basic Latin (0000– 007F )
· Latin-1 Supplement (0080–00FF)
· Latin Extended-A (0100– 017F )
· Latin Extended-B (0180– 024F )
· IPA Extensions (0250–02AF)
· Spacing Modifier Letters (02B0–02FF)
· Combining Diacritical Marks (0300– 036F )
· Greek and Coptic (0370–03FF)
· Cyrillic (0400–04FF)
· Cyrillic Supplement (0500– 052F )
· Armenian (0530– 058F )
· Hebrew (0590–05FF)
· Arabic (0600–06FF)
· Syriac (0700– 074F )
· Arabic Supplement (0750– 077F )
· Thaana (0780–07BF)
· N'Ko (Mandenkan) ( 07C 0–07FF)
· Indic scripts:
o Devanagari (0900– 097F )
o Bengali (0980–09FF)
o Gurmukhi ( 0A 00– 0A 7F )
o Gujarati ( 0A 80–0AFF)
o Oriya (0B00–0B 7F )
o Tamil (0B80–0BFF)
o Telugu ( 0C 00– 0C 7F )
o Kannada ( 0C 80–0CFF)
o Malayalam (0D00–0D 7F )
o Sinhala (0D80–0DFF)
· Thai (0E00–0E 7F )
· Lao (0E80–0EFF)
·QT unicode编码问题