二、GB2312-80的扩展
GBK是GB2312-80的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是0x8140-0xfefe,剔除高位0x80的字位。其所有字符都可以一对一映射到Unicode2.0。
GB18030-2000(GBK2K)在GBK的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。GBK2K从根本上解决了字位不够,字形不足的问题。它有几个特点:
l 它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。
l 编码是变长的,其二字节部分与GBK兼容;四字节部分是扩充的字形、字位,其编码范围是首字节0x81-0xfe、二字节0x30-0x39、三字节0x81-0xfe、四字节0x30-0x39。
l 它的推广是分阶段的,首先要求实现的是能够完全映射到Unicode3.0标准的所有字形。
l 它是国家标准,是强制性的。
l 现在还没有任何一个操作系统或软件实现了GBK2K的支持,这是现阶段和将来汉化的工作内容。
三、Unicode编码
国际标准组织于1984年4月成立ISO/IECJTC1/SC2/WG2工作组,针对各国文字、符号进行统一性编码。1991年美国跨国公司成立UnicodeConsortium,并于1991年10月与WG2达成协议,采用同一编码字集。目前Unicode是采用16位编码体系,其字符集内容与ISO10646的BMP(BasicMultilingualPlane)相同。Unicode于1992年6月通过DIS(DrafInternationalStandard),目前版本V2.0于1996公布,内容包含符号6811个,汉字20902个,韩文拼音11172个,造字区6400个,保留20249个,共计65534个。
随着国际互联网的迅速发展,要求进行数据交换的需求越来越大,不同的编码体系越来越成为信息交换的障碍,而且多种语言共存的文档不断增多,单靠代码页已很难解决这些问题,于是UNICODE应运而生。
UNICODE有双重含义,首先UNICODE是对国际标准ISO/IEC10646编码的一种称谓(ISO/IEC10646是一个国际标准,亦称大字符集,它是ISO于1993年颁布的一项重要国际标准,其宗旨是全球所有文种统一编码),另外它又是由美国的HP、Microsoft、IBM、Apple等大企业组成的联盟集团的名称,成立该集团的宗旨就是要推进多文种的统一编码。
UNICODE同现在流行的代码页最显著不同点在于:UNICODE是两字节的全编码,对于ASCII字符它也使用两字节表示。代码页是通过高字节的取值范围来确定是ASCII字符,还是汉字的高字节。如果发生数据损坏,某处内容破坏,则会引起其后汉字的混乱。UNICODE则一律使用两个字节表示一个字符,最明显的好处是它简化了汉字的处理过程。
UNICODE使用平面来描述编码空间,每个平面分为256行,256列,相对于两字节编码的高低两个字节。
UNICODE的第一个平面,称为BasicMultilingualPlane(基本多文种平面),简称BMP,由于BMP仅用两个字节表示,所以倍受青睐。
图2:BMP的最新概貌图
其中A_ZONE为拼音文字编码区,拉丁文、阿拉伯文、日文的平假名及片假名等都在此区编码。CJKExtensionA和CJK为汉字区域共计27487个汉字。Y1即彝文,位于O-ZONE保留待将来使用。Hangul即韩文。EUDC为用户私有区,用户可以根据需要自己定义此区的编码。R-ZONE为限制使用区,一些兼容字符、特殊字符均放在此区。
UNICODE定义BMP中的D800-DFFF为代理区(SurrogateZone),其中D800-D8FF为高半代理(highsurrogate),DC00-DFFF为低半代理(lowsurrogate)。从两个区域分别取一个编码,组成一个4字节的代理对来表示一个编码字符,此即为UTF-16。利用UTF-16机制,UNICODE扩充了1024*1024个字符,相应于OO-OF平面,并且将02平面分配给了CJKExtensionB。Microsoft在Windows2000已实现了UTF-16。
Unicode编码布局
0000..007F;BasicLatin
0080..00FF;Latin-1Supplement
0100..017F;LatinExtended-A
0180..024F;LatinExtended-B
0250..02AF;IPAExtensions
02B0..02FF;SpacingModifierLetters
0300..036F;CombiningDiacriticalMarks
0370..03FF;GreekandCoptic
0400..04FF;Cyrillic
0500..052F;CyrillicSupplementary
0530..058F;Armenian
0590..05FF;Hebrew
0600..06FF;Arabic
0700..074F;Syriac
0780..07BF;Thaana
0900..097F;Devanagari
0980..09FF;Bengali
0A00..0A7F;Gurmukhi
0A80..0AFF;Gujarati
0B00..0B7F;Oriya
0B80..0BFF;Tamil
0C00..0C7F;Telugu
0C80..0CFF;Kannada
0D00..0D7F;Malayalam
0D80..0DFF;Sinhala
0E00..0E7F;Thai
0E80..0EFF;Lao
0F00..0FFF;Tibetan
1000..109F;Myanmar
10A0..10FF;Georgian
1100..11FF;HangulJamo
1200..137F;Ethiopic
13A0..13FF;Cherokee
1400..167F;UnifiedCanadianAboriginalSyllabics
1680..169F;Ogham
16A0..16FF;Runic
1700..171F;Tagalog
1720..173F;Hanunoo
1740..175F;Buhid
1760..177F;Tagbanwa
1780..17FF;Khmer
1800..18AF;Mongolian
1E00..1EFF;LatinExtendedAdditional
1F00..1FFF;GreekExtended
2000..206F;GeneralPunctuation
2070..209F;SuperscriptsandSubscripts
20A0..20CF;CurrencySymbols
20D0..20FF;CombiningDiacriticalMarksforSymbols
2100..214F;LetterlikeSymbols
2150..218F;NumberForms
2190..21FF;Arrows
2200..22FF;MathematicalOperators
2300..23FF;MiscellaneousTechnical
2400..243F;ControlPictures
2440..245F;OpticalCharacterRecognition
2460..24FF;EnclosedAlphanumerics
2500..257F;BoxDrawing
2580..259F;BlockElements
25A0..25FF;GeometricShapes
2600..26FF;MiscellaneousSymbols
2700..27BF;Dingbats
27C0..27EF;MiscellaneousMathematicalSymbols-A
27F0..27FF;SupplementalArrows-A
2800..28FF;BraillePatterns
2900..297F;SupplementalArrows-B
2980..29FF;MiscellaneousMathematicalSymbols-B
2A00..2AFF;SupplementalMathematicalOperators
2E80..2EFF;CJKRadicalsSupplement
2F00..2FDF;KangxiRadicals
2FF0..2FFF;IdeographicDescriptionCharacters
3000..303F;CJKSymbolsandPunctuation
3040..309F;Hiragana
30A0..30FF;Katakana
3100..312F;Bopomofo
3130..318F;HangulCompatibilityJamo
3190..319F;Kanbun
31A0..31BF;BopomofoExtended
31F0..31FF;KatakanaPhoneticExtensions
3200..32FF;EnclosedCJKLettersandMonths
3300..33FF;CJKCompatibility
3400..4DBF;CJKUnifiedIdeographsExtensionA
4E00..9FFF;CJKUnifiedIdeographs
A000..A48F;YiSyllables
A490..A4CF;YiRadicals
AC00..D7AF;HangulSyllables
D800..DB7F;HighSurrogates
DB80..DBFF;HighPrivateUseSurrogates
DC00..DFFF;LowSurrogates
E000..F8FF;PrivateUseArea
F900..FAFF;CJKCompatibilityIdeographs
FB00..FB4F;AlphabeticPresentationForms
FB50..FDFF;ArabicPresentationForms-A
FE00..FE0F;VariationSelectors
FE20..FE2F;CombiningHalfMarks
FE30..FE4F;CJKCompatibilityForms
FE50..FE6F;SmallFormVariants
FE70..FEFF;ArabicPresentationForms-B
FF00..FFEF;HalfwidthandFullwidthForms
FFF0..FFFF;Specials
10300..1032F;OldItalic
10330..1034F;Gothic
10400..1044F;Deseret
1D000..1D0FF;ByzantineMusicalSymbols
1D100..1D1FF;MusicalSymbols
1D400..1D7FF;MathematicalAlphanumericSymbols
20000..2A6DF;CJKUnifiedIdeographsExtensionB
2F800..2FA1F;CJKCompatibilityIdeographsSupplement
E0000..E007F;Tags
F0000..FFFFF;SupplementaryPrivateUseArea-A
100000..10FFFF;SupplementaryPrivateUseArea-B
0000..007F;BasicLatin
0080..00FF;Latin-1Supplement
0100..017F;LatinExtended-A
0180..024F;LatinExtended-B
0250..02AF;IPAExtensions
02B0..02FF;SpacingModifierLetters
0300..036F;CombiningDiacriticalMarks
0370..03FF;GreekandCoptic
0400..04FF;Cyrillic
0500..052F;CyrillicSupplementary
0530..058F;Armenian
0590..05FF;Hebrew
0600..06FF;Arabic
0700..074F;Syriac
0780..07BF;Thaana
0900..097F;Devanagari
0980..09FF;Bengali
0A00..0A7F;Gurmukhi
0A80..0AFF;Gujarati
0B00..0B7F;Oriya
0B80..0BFF;Tamil
0C00..0C7F;Telugu
0C80..0CFF;Kannada
0D00..0D7F;Malayalam
0D80..0DFF;Sinhala
0E00..0E7F;Thai
0E80..0EFF;Lao
0F00..0FFF;Tibetan
1000..109F;Myanmar
10A0..10FF;Georgian
1100..11FF;HangulJamo
1200..137F;Ethiopic
13A0..13FF;Cherokee
1400..167F;UnifiedCanadianAboriginalSyllabics
1680..169F;Ogham
16A0..16FF;Runic
1700..171F;Tagalog
1720..173F;Hanunoo
1740..175F;Buhid
1760..177F;Tagbanwa
1780..17FF;Khmer
1800..18AF;Mongolian
1E00..1EFF;LatinExtendedAdditional
1F00..1FFF;GreekExtended
2000..206F;GeneralPunctuation
2070..209F;SuperscriptsandSubscripts
20A0..20CF;CurrencySymbols
20D0..20FF;CombiningDiacriticalMarksforSymbols
2100..214F;LetterlikeSymbols
2150..218F;NumberForms
2190..21FF;Arrows
2200..22FF;MathematicalOperators
2300..23FF;MiscellaneousTechnical
2400..243F;ControlPictures
2440..245F;OpticalCharacterRecognition
2460..24FF;EnclosedAlphanumerics
2500..257F;BoxDrawing
2580..259F;BlockElements
25A0..25FF;GeometricShapes
2600..26FF;MiscellaneousSymbols
2700..27BF;Dingbats
27C0..27EF;MiscellaneousMathematicalSymbols-A
27F0..27FF;SupplementalArrows-A
2800..28FF;BraillePatterns
2900..297F;SupplementalArrows-B
2980..29FF;MiscellaneousMathematicalSymbols-B
2A00..2AFF;SupplementalMathematicalOperators
2E80..2EFF;CJKRadicalsSupplement
2F00..2FDF;KangxiRadicals
2FF0..2FFF;IdeographicDescriptionCharacters
3000..303F;CJKSymbolsandPunctuation
3040..309F;Hiragana
30A0..30FF;Katakana
3100..312F;Bopomofo
3130..318F;HangulCompatibilityJamo
3190..319F;Kanbun
31A0..31BF;BopomofoExtended
31F0..31FF;KatakanaPhoneticExtensions
3200..32FF;EnclosedCJKLettersandMonths
3300..33FF;CJKCompatibility
3400..4DBF;CJKUnifiedIdeographsExtensionA
4E00..9FFF;CJKUnifiedIdeographs
A000..A48F;YiSyllables
A490..A4CF;YiRadicals
AC00..D7AF;HangulSyllables
D800..DB7F;HighSurrogates
DB80..DBFF;HighPrivateUseSurrogates
DC00..DFFF;LowSurrogates
E000..F8FF;PrivateUseArea
F900..FAFF;CJKCompatibilityIdeographs
FB00..FB4F;AlphabeticPresentationForms
FB50..FDFF;ArabicPresentationForms-A
FE00..FE0F;VariationSelectors
FE20..FE2F;CombiningHalfMarks
FE30..FE4F;CJKCompatibilityForms
FE50..FE6F;SmallFormVariants
FE70..FEFF;ArabicPresentationForms-B
FF00..FFEF;HalfwidthandFullwidthForms
FFF0..FFFF;Specials
10300..1032F;OldItalic
10330..1034F;Gothic
10400..1044F;Deseret
1D000..1D0FF;ByzantineMusicalSymbols
1D100..1D1FF;MusicalSymbols
1D400..1D7FF;MathematicalAlphanumericSymbols
20000..2A6DF;CJKUnifiedIdeographsExtensionB
2F800..2FA1F;CJKCompatibilityIdeographsSupplement
E0000..E007F;Tags
F0000..FFFFF;SupplementaryPrivateUseArea-A
100000..10FFFF;SupplementaryPrivateUseArea-B
四、大五码(Big5)
如不去考虑特殊符号,及后来的七个扩充字,TW-BIG5 的排序方式如下。将所有的字分成两大群:常用字区与次常用字区,每一个字区分别用笔画来排序,同一个笔画的字,依部首来排。TW-BIG5 每个字由两个字节组成,其第一字节编码范围为0xA1~0xF9,第二字节编码范围为0x40~0x7E与0xA1~0xFE,总计收入13868个字 (包括5401个常用字、7652 个次常用字、7个扩充字、以及808个各式符号),其中可以大致划分为以下几个字区:
第一字节 | 第二字节 | 字区 | 制定 |
A1..A2 | 40..7E, A1..FE | 各种符号区 | 1984 |
A3 | 40..7E, A1..BF | 各种符号区 (包括标点符号、ASCII 全角符号、注音符号等) | 1984 |
A3 | E1 | 欧元符号 | CP950 |
A4..C5 | 40..7E, A1..FE | 常用字区 | 1984 |
C6 | 40..7E | 常用字区 | 1984 |
C6 | A1..FE | 罕用符号区 | 倚天 |
C7 | 40..7E, A1..FE | 罕用符号区 (包括日文、俄文等) | 倚天 |
C8 | 40..7E, A1..D3 | 罕用符号区 (包括俄文、输入法特殊符号等) | 倚天 |
C9..F8 | 40..7E, A1..FE | 次常用字区 | 1984 |
F9 | 40..7E, A1..D5 | 次常用字区 | 1984 |
F9 | D6..DC | 七个扩充字 | 倚天 |
F9 | DD..FE | 表格符号区 | 倚天 |
Table 1. BIG5字区与编码范围
扩充字 | BIG5 码 | Unicode 码 | BIG5_1984 的同义字 |
碁 | 0xF9D6 | 0x88CF | 棋 |
锈 | 0xF9D7 | 0x92B9 | 锈 |
里 | 0xF9D8 | 0x7CA7 | 里 |
墙 | 0xF9D9 | 0x58BB | 墙 |
恒 | 0xF9DA | 0x6052 | 恒 |
妆 | 0xF9DB | 0x7881 | 妆 |
娴 | 0xF9DC | 0x5AFA | 娴 |
Table 2. 七个扩充字
编码 | 第一个字节 | 第二个字节 | 第三个字节 | 第四个字节 |
GB2312 | 0xB0 - 0xF7 | 0xA0 - 0xFE |
|
|
GBK | 0x81 - 0xFE | 0x40 - 0xFE |
|
|
GB18030 的双字节 | 0x81 - 0xFE | 0x40 - 0x7E, 0x80 - 0xFE |
|
|
GB18030 的四字节 | 0x81 - 0xFE | 0x30 - 0x39 | 0x81 - 0xFE | 0x30 - 0x39 |
Table 3. GB 的汉字编码规则
五、如何判断一个汉字是big5或是gb
大陆电脑中的汉字多以GB2312标准进行编码,简称GB码或国标码,共定义6763汉字,编码如下:
第一字节,行码0xA1-0xFE,第二节字,列码0xA1-0xFE,每行94个汉字。其中,1-15行(A1-AF)全角字母、符号;16-55行(B0-CF)以拼音为序的一级汉字3755字;56-87行(D0-F7)以部首为序的二级汉字3008字。例如:GB码16行1列表示“啊”字,编码为0xB0A1。
港台电脑中的汉字则多以BIG5编码,共定义了13053汉字,汉字部分均以部首为序,编码如下:
第一节字,行码0xA1-0xFE,第二节字,列码0x40-0x7E,0xA1-0xFE,每行157个汉字;其中,1-3/38-40行(A1-A3,C6-C8)全角字母、符号,4-39行(A4-C6)一级汉字5401字,41-89行(C9-F9)二级汉字7652字。例如:BIG5码16行121列同样表示“啊”字,编码为0xB0DA。
GBK又称GB扩展编码或GB13000,就是这样的一个汉字编码,它是是在兼容GB码的基础上,将GB码中不存在的ISO10646.1汉字,按Unicode编码顺序进行重新编码。其编码空间包含几个子集,其中GBK/2就是GB码汉字;各子集的编码情况见下表。
子集编码范围编码空间编码字数
GBK/10xA1A1-0xA9FE846717
GBK/20xB0A1-0xF7FE6,7686,763
GBK/30x8140-0xA0FE6,0806,080
GBK/40xAA40-0xFEA08,1608,160
GBK/50xA840-0xA9A0192166
EUDC/10xAAA1-0xAFFE564用户定义1
EUDC/20xF8A1-0xFEFE658用户定义2
EUDC/30xA140-0xA7A0672用户定义3
一般是这样辨别的:
1、GBcode的内码的两个字节都是从A0H-FEH之间的;
2、BIGcode的内码的第一个字节是80H-FFH,第二个字节是00H-FFH;
你要浏览全文,看看是否有第二个字节是小于7FH的汉字,如果有的话,一般是BIGcode的。当然也有特殊情况,不过非常少见的。
判断一段文字中是否含有BIG5码汉字,可用做内码的自动识别
返回True表示包含BIG5码
返回False表示不含BIG5码,这段文字一般可认为是GB码
FunctionCheckBIG(strSourceAsString)AsBoolean
DimidxAsLong
DimByteTemp()AsByte
CheckBIG=False
Foridx=1ToLen(strSource)
ByteTemp=StrConv(Mid(strSource,idx,1),vbFromUnicode)
IfUBound(ByteTemp)>0Then
IfByteTemp(1)>=64AndByteTemp(1)<=126Then
CheckBIG=True
ExitFor
EndIf
EndIf
Next
EndFunction
参考:
http://www.china-askpro.com/msg6/qa41.shtml
http://www.clyrics.com/stonec/hanzi/gbngbk.htm