求一算法,将文本文件中的字符转化成GB2312字库中的汉字编码

cannoesword 2008-03-05 08:16:23
一个文本中有汉字,字母,数字,标点等字符,求一个算法把这些字符转换成编码,然后保存在另一个文本中
...全文
263 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
cbm6666 2008-03-16
转载: GB2312

字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

这里还有一些细节:

GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

在DBCS中,GB内码的存储格式始终是big endian,即高位在前。

GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

GB2312字符表如下:

+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A1A0   、 。 · ˉ ˇ ¨ 〃 々 — ~ ‖ … ‘ ’
A1B0 “ ” 〔 〕 〈 〉 《 》 「 」 『 』 〖 〗 【 】
A1C0 ± × ÷ ∶ ∧ ∨ ∑ ∏ ∪ ∩ ∈ ∷ √ ⊥ ∥ ∠
A1D0 ⌒ ⊙ ∫ ∮ ≡ ≌ ≈ ∽ ∝ ≠ ≮ ≯ ≤ ≥ ∞ ∵
A1E0 ∴ ♂ ♀ ° ′ ″ ℃ $ ¤ ¢ £ ‰ § № ☆ ★
A1F0 ○ ● ◎ ◇ ◆ □ ■ △ ▲ ※ → ← ↑ ↓ 〓

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A2A0 ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ     
A2B0  ⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖
A2C0 ⒗ ⒘ ⒙ ⒚ ⒛ ⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾
A2D0 ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ① ② ③ ④ ⑤ ⑥ ⑦
A2E0 ⑧ ⑨ ⑩   ㈠ ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ 
A2F0  Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ  

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A3A0 ! " # ¥ % & ' ( ) * + , - . /
A3B0 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
A3C0 @ A B C D E F G H I J K L M N O
A3D0 P Q R S T U V W X Y Z [ \ ] ^ _
A3E0 ` a b c d e f g h i j k l m n o
A3F0 p q r s t u v w x y z { | }  ̄

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A4A0 ぁ あ ぃ い ぅ う ぇ え ぉ お か が き ぎ く
A4B0 ぐ け げ こ ご さ ざ し じ す ず せ ぜ そ ぞ た
A4C0 だ ち ぢ っ つ づ て で と ど な に ぬ ね の は
A4D0 ば ぱ ひ び ぴ ふ ぶ ぷ へ べ ぺ ほ ぼ ぽ ま み
A4E0 む め も ゃ や ゅ ゆ ょ よ ら り る れ ろ ゎ わ
A4F0 ゐ ゑ を ん           

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A5A0 ァ ア ィ イ ゥ ウ ェ エ ォ オ カ ガ キ ギ ク
A5B0 グ ケ ゲ コ ゴ サ ザ シ ジ ス ズ セ ゼ ソ ゾ タ
A5C0 ダ チ ヂ ッ ツ ヅ テ デ ト ド ナ ニ ヌ ネ ノ ハ
A5D0 バ パ ヒ ビ ピ フ ブ プ ヘ ベ ペ ホ ボ ポ マ ミ
A5E0 ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ヮ ワ
A5F0 ヰ ヱ ヲ ン ヴ ヵ ヶ        

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A6A0 Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο
A6B0 Π Ρ Σ Τ Υ Φ Χ Ψ Ω       
A6C0  α β γ δ ε ζ η θ ι κ λ μ ν ξ ο
A6D0 π ρ σ τ υ φ χ ψ ω       
A6E0 ︵ ︶ ︹ ︺ ︿ ﹀ ︽ ︾ ﹁ ﹂ ﹃ ﹄   ︻ ︼
A6F0 ︷ ︸ ︱  ︳ ︴         

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A7A0 А Б В Г Д Е Ё Ж З И Й К Л М Н
A7B0 О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э
A7C0 Ю Я              
A7D0  а б в г д е ё ж з и й к л м н
A7E0 о п р с т у ф х ц ч ш щ ъ ы ь э
A7F0 ю я             

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A8A0 ā á ǎ à ē é ě è ī í ǐ ì ō ó ǒ
A8B0 ò ū ú ǔ ù ǖ ǘ ǚ ǜ ü ê ɑ  ń ň 
A8C0 ɡ     ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ
A8D0 ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ
A8E0 ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ ㄧ ㄨ ㄩ      
A8F0               

code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
A9A0    ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋
A9B0 ┌ ┍ ┎ ┏ ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛
A9C0 ├ ┝ ┞ ┟ ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫
A9D0 ┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻
A9E0 ┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋

汉字如下: 我用代码, 贴不下啦,太长受限制了

【CBM666 的汉字列表】

'添加Text1 Multiline要设为True Scrollbars自己也要加上

Option Explicit
Dim i&, j&, aa$, a&
Private Sub Form_Load()
Me.Width = 12000: Me.Height = 8000
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
Me.Caption = "CBM666的汉字列表"
Text1.Move 0, 0, Me.Width - 200, Me.Height - 200
End Sub

Private Sub Form_Activate()
Text1.FontSize = 14
'**************************开始显示汉字
aa = ""
'用区与位得到汉字 区16-87 位01-94
For i = 16 To 87
For j = 1 To 94
'DoEvents
a = (i + 160) * &H100 + (j + 160)
aa = aa & Chr(a)
Next j
Next i
Text1.Text = aa
End Sub

效果图:
http://hiphotos.baidu.com/cbm666/pic/item/ec24fc039748758dd43f7c8f.jpg
回复
cannoesword 2008-03-09
请问一下GB2312的中存在字符吗???
回复
cbm6666 2008-03-06
Dim aa$, bb$, i%, h$
改为
Dim aa$, bb$, i%, h$,s
回复
cbm6666 2008-03-06
'添加 Command1 Command2

Dim aa$, bb$, i%, h$
Private Sub Form_Load()
Command1.Caption = "保 存"
Command2.Caption = "读 取"
End Sub

Private Sub Command1_Click()
aa = "123百度VB吧;,456.CBM666的字符转换"
bb = ""
For i = 1 To Len(aa)
h = Hex(Asc(Mid(aa, i, 1)))
bb = bb & CStr(Val("&H" + Mid(h, 1, 2)) * 256 + Val("&H" + Mid(h, 3, 2))) & " "
Next i
Open "c:\test.txt" For Output As #1
Print #1, bb
Close #1
MsgBox "保存完成"
End Sub

Private Sub Command2_Click()
If Dir("c:\test.txt") = "" Then Exit Sub
Open "c:\test.txt" For Input As #1
Line Input #1, aa
Close #1
s = Split(Trim(aa), " ")
For i = 0 To UBound(s)
Print Chr(s(i));
Next i
End Sub

回复
asc("汉")
asc("字")
得到的就是内码,符合gb2312编码的

简单来说,如果得到的值小0,是汉字,大于等于0,是字母。
回复
cannoesword 2008-03-06
每个汉字,字符在计算机中都有惟一的内码,我想得到这些内码,怎么用程序来实现?
回复
俺不太明白楼主要做什么,您是要下面这种转换吗?

//Unicode流转换成GB2312码,GB2312的ASCII流
556E69636F6465C1F7D7AABBBBB3C9474232333132C2EBA3AC474232333132B5C44153434949C1F7

//Unicode流转换成GB2312码,GB2312的ASCII流,类似C语言
0x55, 0x6E, 0x69, 0x63, 0x6F, 0x64, 0x65, 0xC1, 0xF7, 0xD7, 0xAA, 0xBB, 0xBB, 0xB3, 0xC9, 0x47, 0x42, 0x32, 0x33, 0x31, 0x32, 0xC2, 0xEB, 0xA3, 0xAC, 0x47, 0x42, 0x32, 0x33, 0x31, 0x32, 0xB5, 0xC4, 0x41, 0x53, 0x43, 0x49, 0x49, 0xC1, 0xF7, 0xA3, 0xAC, 0xC0, 0xE0, 0xCB, 0xC6, 0x43, 0xD3, 0xEF, 0xD1, 0xD4,

还是其他的?
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7522

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-03-05 08:16
社区公告
暂无公告