本站首页    管理页面    写新日志    退出


«February 2026»
1234567
891011121314
15161718192021
22232425262728


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:111
评论数量:190
留言数量:-24
访问次数:646841
建立时间:2007年4月21日




汉字编码问题
网上资源,  软件技术,  科学研究

赵勇 发表于 2007/8/16 10:45:48

汉字编码问题 一、GB2312-80介绍   GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。 GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312-80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。 GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。 GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。 500)this.width=500'> 图1:GB2312编码图 图中位于ASCII区中的虚线区域即为原GB2312编码区域,右下角实线区域为平移后的GB2312编码区域。   二、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仅用两个字节表示,所以倍受青睐。 500)this.width=500'> 500)this.width=500'> 图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 http://www.6to23.com/s11/s11d3/200191010412.htm http://www.khngai.com/chinese/charmap/tblgbmain.php?page=0  


阅读全文(3047) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.707 second(s), page refreshed 144809102 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号