如何判斷一個漢字是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码中不存在的ISO 10646.1汉字,按Unicode编码顺序进行重新编码。其编码空间包含几个子集,其中GBK/2就是GB码汉字;各子集的编码情况见下表。

子集 编码范围 编码空间 编码字数
===== ============= ======== =========
GBK/1 0xA1A1-0xA9FE 846 717
GBK/2 0xB0A1-0xF7FE 6,768 6,763
GBK/3 0x8140-0xA0FE 6,080 6,080
GBK/4 0xAA40-0xFEA0 8,160 8,160
GBK/5 0xA840-0xA9A0 192 166
EUDC/1 0xAAA1-0xAFFE 564 用户定义1
EUDC/2 0xF8A1-0xFEFE 658 用户定义2
EUDC/3 0xA140-0xA7A0 672 用户定义3

一般是这样辨别的:
1. GB code的内码的两个字节都是从A0H - FEH之间的
2. BIG code 的内码的第一个字节是80H - FFH,第二个字节是00H - FFH
所以,你要浏览全文,看看是否有第二个字节是小于7FH的汉字,如果有的话,一般是BIG code的。当然也有特殊情况,不过非常少见的。

'判断一段文字中是否含有BIG5码汉字 , 可用做内码的自动识别
'返回True表示包含BIG5码
'返回False表示不含BIG5码 , 这段文字一般可认为是GB码
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function CheckBIG(strSource As String) As Boolean
Dim idx As Long
Dim ByteTemp() As Byte
CheckBIG = False
For idx = 1 To Len(strSource)
ByteTemp = StrConv(Mid(strSource, idx, 1), vbFromUnicode)
If UBound(ByteTemp) > 0 Then
If ByteTemp(1) >= 64 And ByteTemp(1) <= 126 Then
CheckBIG = True
Exit For
End If
End If
Next
End Function

参考:
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

Published At
Categories with Web编程
Tagged with
comments powered by Disqus