C#中如何根据GB2312字符集区位码获得汉字?

发布时间 2023-10-22 10:24:44作者: 一路探索者

一、GB2312字符集汉字编码间的转换

1、区位码转换为国标码方法如下:

国标码高位字节=(区号)H+20H

国标码低位字节=(位号)H+20H

区位码转换为国标码的方法是加2020H

 

2、国标码转换为机内码方法如下:

机内码高位字节=(国标码)H+80H

机内码低位字节=(国标码)H+80H

国标码转换为机内码的方法是加8080H

 

3、区位码转换为机内码方法如下:

可见,区位码到机内码加了两次:20H + 80H = 32 + 128 = 160 = A0H

因此,区位码转换机内码的方法,是高位字节和低位字节加160。

机内码高位字节=(区号)H+A0H

机内码低位字节=(位号)H+A0H

区位码转换为机内码的方法是加A0 A0H

      

4、机内码转换为区位码方法如下:

机内码转换区位码的方法,是高位字节和低位字节减160。

机内码转换为区位码的方法是减A0A0H

 

注意:计算机使用的字符都为机内码!

 

二、部分GB2312字符集

      为帮助理解,以下提供部分GB2312字符集。

01 0 1 2 3 4 5 6 7 8 9
0     、 。 · ˉ ˇ ¨ 〃 々
1 — ~ ‖ … ‘ ’ “ ” 〔 〕
2 〈 〉 《 》 「 」 『 』 〖 〗
3 【 】 ± × ÷ ∶ ∧ ∨ ∑ ∏
4 ∪ ∩ ∈ ∷ √ ⊥ ∥ ∠ ⌒ ⊙
5 ∫ ∮ ≡ ≌ ≈ ∽ ∝ ≠ ≮ ≯
6 ≤ ≥ ∞ ∵ ∴ ♂ ♀ ° ′ ″
7 ℃ $ ¤ ¢ £ ‰ § № ☆ ★
8 ○ ● ◎ ◇ ◆ □ ■ △ ▲ ※
9 → ← ↑ ↓ 〓
 
02 0 1 2 3 4 5 6 7 8 9
0   ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ
1 ⅹ       ⒈ ⒉ ⒊
2 ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔
3 ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ ⑴ ⑵ ⑶
4 ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀
5 ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ ① ② ③
6 ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩   ㈠
7 ㈡ ㈢ ㈣ ㈤ ㈥ ㈦ ㈧ ㈨ ㈩ 
8  Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ
9 Ⅹ Ⅺ Ⅻ  
 
03 0 1 2 3 4 5 6 7 8 9
0   ! " # ¥ % & ' ( )
1 * + , - . / 0 1 2 3
2 4 5 6 7 8 9 : ; < =
3 > ? @ A B C D E F G
4 H I J K L M N O P Q
5 R S T U V W X Y Z [
6 \ ] ^ _ ` a b c d e
7 f g h i j k l m n o
8 p q r s t u v w x y
9 z { | }  ̄

 

17 0 1 2 3 4 5 6 7 8 9
0   薄 雹 保 堡 饱 宝 抱 报 暴
1 豹 鲍 爆 杯 碑 悲 卑 北 辈 背
2 贝 钡 倍 狈 备 惫 焙 被 奔 苯
3 本 笨 崩 绷 甭 泵 蹦 迸 逼 鼻
4 比 鄙 笔 彼 碧 蓖 蔽 毕 毙 毖
5 币 庇 痹 闭 敝 弊 必 辟 壁 臂
6 避 陛 鞭 边 编 贬 扁 便 变 卞
7 辨 辩 辫 遍 标 彪 膘 表 鳖 憋
8 别 瘪 彬 斌 濒 滨 宾 摈 兵 冰
9 柄 丙 秉 饼 炳

 

      本例的关键代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Text; //引用Encoding类

 

namespace Ex04_19

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            textBox1.Text = "17";

            textBox2.Text = "3";

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            byte[]pArray = new byte[2];

 

            //获取区号

            string strRegion = textBox1.Text.Trim();

            int iRegion = Convert.ToByte(strRegion);

 

            //获取码位

            string strPos = textBox2.Text.Trim();

            int iPos = Convert.ToByte(strPos);

 

            //前两位加160,存入字节数组

            pArray[0]=(byte)(iRegion+160);

 

            //后两位加160,存入字节数组

            pArray[1]=(byte)(iPos+160);

 

            //由字节数组获得汉字

            Encoding defEnd = Encoding.Default;

            string chinese = defEnd.GetString(pArray);

 

            textBox3.Text = chinese;

        }

    }

}