链接:http://www.cnblogs.com/zl0372/p/unicode.html
为了使不同的字符集能够处理好不同的文字和语言,必须满足:
1. 不同时引用多种文字。
2. 不与使用不同字符集的人交换文件。
由于Mac和PC机都使用不同的字符集,越来越多的人无法遵循以上原则。很明显的是需要一种得到大家的认可并且编码了全世界各种文字的字符集。建立这样的字符集很难,需要对成百上千种语言和文字有细致的了解。要使软件开发商们同意使用这种字符集就更难了。不过这方面的努力一直在进行,终于创建了一个符合要求的字符集Unicode。而且主要卖方(微软、苹果、IBM、Sun、Be等)正逐步趋向于使用它。XML把Unicode当作自己的默认字符集。
Unicode使用0~65,535的双字节无符号数对每一个字符进行编码。目前已经定义了40,000多个不同的Unicode字符,剩余25,000个空缺留给将来扩展之用。其中大约20,000个字符用于汉字,另外11,000左右的字符用于韩语音节。Unicode中0~`255的字符与Latin-1中的一致。
如果在本书中显示所有的Unicode字符,那么除了这些字符表格外,书中将容纳不下别的任何东西。如果需要知道Unicode中不同字符的确定编码,买一册Unicode标准(第二版,ISBN 0-201-48346-9,Addison-Wesley出版)。该书共950页,包括对Unicode 2.0的全部详细说明,还包括Unicode 2.0中定义的所有字符集的图表。还可以在Unicode协会的网址:http://www.unicode.org/和http://charts.unicode.org/中发现在线信息。表7-6列出了由Unicode编码的文字,由此可知Unicode的广泛性。每一种文字的字符通常编码在65,536个号码中的一个连续区域内。许多语言都能使用其中某一区域的字符书写(例如,使用古斯拉夫语书写俄语),尽管有一些语言,如克罗地亚语或土耳其语需要混合匹配前4个拉丁文区域中的字符。
表7-6 Unicode文字块
文 字 |
范 围 |
目 的 |
Basic Latin 基本拉丁语 |
0-127 |
ASCII码,美式英语 |
Latin-1 Supplement 拉丁语补充-1 |
126-255 |
ISO Latin-1前半部分结合Basic Latin能处理丹麦语、荷兰语、英语、法罗群岛语、佛兰德语、德语、夏威夷语、冰岛语、印度尼西亚语、爱尔兰语、挪威语、葡萄牙语、西班牙语、斯瓦西里语和瑞典语 |
Latin Extended-A 拉丁文扩展集-A |
256-383 |
该字符块增添了ISO 8859字符集Latin-2、Latin-3、Latin-4中的字符,而且是Basic Latin和Latin-1没有的字符。同它们结合能够编码南非荷兰语、法国布里多尼语、巴斯克语、加泰罗尼亚语、捷克语、世界语、爱沙尼亚语、法语、Friesland语、格陵兰岛语、匈牙利语、拉脱维亚语、立陶宛语、马耳它语、波兰语、普罗旺斯语、罗马尼亚语、吉普塞语、斯洛伐克语、斯洛文尼亚语、土耳其语和威尔士语 |
Latin Extended-B 拉丁文扩展集-B |
383-591 |
大部分字符用于扩展Latin文字以处理使用非传统文字写的语言,包括许多非洲语言、克罗地亚连字符,与塞尔维亚古斯拉夫字母、中国的拼音和Latin-10中的Sami characters相匹配 |
IPA扩展字符集 |
592-687 |
国际音标字母 |
间距调节字符 |
686-767 |
通常能够改变前面字母发音的小符号 |
可识别的连接字符 |
766-879 |
不独立存在,一般与前面的字母连用(放置在上边)的可识别的记号,如:~、‘and ?? |
希腊 |
880-1023 |
基于ISO 8859-7的现代希腊语,同时提供古埃及语字符 |
续表 |
||
文 字 |
范 围 |
目 的 |
古斯拉夫 |
1024-1279 |
基于ISO 8859-5上的语言,俄语和多数斯拉夫语(乌克兰语、Byelorussian等),前苏联的许多非斯拉夫语言(Azerbaijani,Ossetian,卡巴尔德语,Chechen,Tajik等).几种语言(库尔德语,阿布哈西亚语)需要Latin和古斯拉夫字母 |
美国 |
1326-1423 |
美语 |
希伯来 |
1424-1535 |
希伯来语(古典和现代)、依地语、Judezmo、早期美语。 |
阿拉伯 |
1536-1791 |
阿拉伯语,波斯语、Pashto、Sindhi、库尔德语和早期土耳其语 |
梵文字母 |
2304-2431 |
梵语,北印度语,尼泊尔语和印度次大陆语言,包括: |
孟加拉语 |
2432-2559 |
一种北印度文字,使用于印度的西孟加拉州和孟加拉国的孟加拉语、阿萨姆语、 |
Gurmukhi |
2560-2687 |
Punjabi |
Gujarati |
2686-2815 |
Gujarati |
Oriya |
2816-2943 |
Oriya、Khondi、Santali |
泰米尔语 |
2944-3071 |
泰米尔语和Badaga、使用于南印度、斯里兰卡、新加坡和马来西亚部分地区 |
Telugu |
3072-3199 |
Telugu、Gondi、Lambadi |
埃纳德语 |
3200-3327 |
埃纳德语、Tulu |
Malalayam |
3326-3455 |
Malalayam |
泰国语 |
3584-3711 |
泰国语、Kuy、Lavna、巴利语 |
老挝语 |
3712-3839 |
老挝语 |
*语 |
3840-4031 |
喜玛拉雅语包括*语、Ladakhi和Lahuli |
乔治亚语 |
4256-4351 |
乔治亚语,黑海边乔治亚前苏维埃*语 |
Hangul Jamo |
4352-4607 |
朝鲜、韩国音节的字母组成部分 |
Latin的附加扩展集 |
7680-7935 |
标准的Latin字母如E和Y与可识别的记号组合在一起,除了用于越南语元音中,很少使用 |
希腊语扩展集 |
7936-8191 |
希腊字母与可识别记号的组合,用于正统的希腊语中 |
通用的标点符号 |
8192-8303 |
各种标点符号 |
上标和下标 |
8304-8351 |
普通的上标和下标 |
货币符号 |
8352-8399 |
货币符号,一般在别的地方找不到 |
用于符号的组合记号 |
8400-8447 |
给多个字符做记号 |
像字母的符号 |
8446-8527 |
像字母的符号,如? |
数表 |
8526-8591 |
分数和罗马数字 |
箭头符号 |
8592-8703 |
箭头符号 |
数学符号 |
8704-8959 |
不常出现的数学运算符 |
技术杂项 |
8960-9039 |
APL编程语言需要的符号和其他各种技术符号 |
控制图形 |
9216-9279 |
ASCII控制字符图形,常用于调试 |
光学字符识别 |
9280-9311 |
在打印支票上的OCR-A(光学字符识别)和MICR(磁性墨水字符识别)符号 |
续表 |
||
文 字 |
范 围 |
目 的 |
附加字符 |
9312-9471 |
放在圆和括号中的字母和数字 |
画方框字符 |
9472-9599 |
用于在等间距终端上画方框的字符 |
块元素 |
9600-9631 |
用于DOS和其他用途的等间距终端图形 |
几何形状 |
9632-9727 |
正方形、菱形、三角形等 |
杂项符号 |
9726-9983 |
纸牌、象棋、占卜等 |
Dingbats |
9984-10175 |
Zapf Dingbat字符 |
CJK符号和标点 |
12286-12351 |
用于中国\日本和韩国的标点符号 |
平假名 |
12352-12447 |
日文字母的草体. |
片假名 |
12446-12543 |
非草体的日文字母,通常用于西方的外来词汇,像"keyboard" |
汉语拼音字母 |
12544-12591 |
中国的发音字母表 |
Hangul Compatibility Jamo |
12592-12687 |
与KSC 5601代码兼容的韩国字符 |
Kanbun |
12686-12703 |
在日文中用于指示古典中文的阅读顺序的记号 |
括起来的CJK字母和月份 |
12800-13055 |
用圆和括号括起来的Hangul和片假名字符 |
CJK Compatibility |
13056-13311 |
只用于编码KSC 5601和CNS 11643的字符 |
统一的CJK象形文字 |
19966-40959 |
用于中文、日文和韩文的Han象形文字 |
Hangul音节 |
44032-55203 |
一种韩国音节 |
Surrogates |
55296-57343 |
目前还不能使用,将来可用于扩展Unicode,使它包括超过百万的字符 |
个人使用 |
57344-63743 |
软件开发者可以在此包含自己的术语,与正在执行的字符不同 |
CJK兼容性象形文字 |
63744-64255 |
为了保持与现有的标准的一致性如KSC 5601,而使用的一些汉字象形文字 |
字母的表现方式 |
64256-64335 |
使用于Latin、美语和希伯来语中的连字和变种 |
阿拉伯表象形式 |
64336-65023 |
各种阿拉伯字符的变种 |
组合半记号 |
65056-65071 |
把跨越多个字符的多个可识别记号连成一个可识别的记号 |
CJK兼容性形式 |
65072-65103 |
用于*汉字象形文字 |
小型变种 |
65104-65135 |
用于*的ASCII标点符号的小的版本 |
附加的阿拉伯表象形式 |
65136-65279 |
各种阿拉伯字符变种 |
半宽和全宽形式 |
65280-65519 |
能够在中文和日文的不同代码间转换的字符 |
特殊字符 |
65520-65535 |
字节顺序记号和零宽度的非中断性空格,常用于Unicode 文件的开始 |
7.4.1 UTF-8
Unicode使用双字节表示一个字符,因此使用Unicode的英文文本文件大小是使用ASCII码或Latin-1文件的两倍。UTF-8是一个压缩的Unicode版本,使用单个字节表示最常用的字符,即0到127的ASCII字符,较少见的字符使用三个字节表示,特制是韩国音节和汉字。如果主要使用英文,UTF-8能够将文件压缩为原来的一半。如果主要使用汉语、朝语或者日语,UTF-8会使文件的尺寸增加50%因此应当谨慎使用UTF-8。UTF-8几乎不能处理非罗马文字和非CJK文字,如希腊语、阿拉伯语、古斯拉夫语和希伯来语。
XML处理器在没有被预先通知的情况下假定文本数据是UTF-8格式。这意味着XML处理器能够阅读ASCII码文件,但是使用它处理其他格式的文件像MacRoman 或者 Latin-1会有困难。我们很快就能学会如何在短时间内解决这个问题。
7.4.2 通用字符系统
Unicode因为没有包含足够多的语言和文字而受到批评,特别是亚洲东部的语言。它只定义了中国、日本、朝鲜和古越南使用的80,000象形文字中的20,000个左右。(现代越南语使用一种罗马字母。)
UCS (Universal Character System)通用字符系统,也称作ISO 10646,使用四个字节(确切地说是31位)表示一个字符,以给20多亿不同的字符提供足够的空间。这样能容易地覆盖地球上任何一种文字和语言使用的每个字符。而且还可以给每一种语言指定一个完整的字符集,使法语中的“e”不同于英语和德语中的“e”等等。
与Unicode一样,UCS定义了许多不同的变种和压缩形式。纯粹的Unicode有时指USC-2,是双字节的UCS。UTF-16是一种特别的编码,它把一些UCS字符安排在长度变化的字符串中,在这种方式下Unicode(UCS-2)数据不会改变。
UCS超越Unicode的优点主要是理论方面的。在UCS中实际定义过的字符就是Unicode中已有的字符。但是UCS为以后的字符扩充提供了更多的空间。