当前位置:首页 > 技术 > 单片机 > 正文内容

关于GBK字库编码读取的演示

Watrt7年前 (2018-04-03)单片机21010

    GBK编码与gb2312编码不同的是gb2312每一个区有94个汉字是从0xA1-0xFE

    GB2312编码对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。这种表示方式也称为区位码。

    GB2312编码对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。

    这种表示方式也称为区位码。

    01-09区收录除汉字外的682个字符。 

    10-15区为空白区,没有使用。 16-55区收录3755个一级汉字,按拼音排序。

     56-87区收录3008个二级汉字,按部首/笔画排序。 

    88-94区为空白区,没有使用。 

    举例来说,“啊”字是GB2312编码中的第一个汉字,它位于16区的01位,所以它的区位码就是1601。

    GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位。所以它的区位码范围是:0101-9494。区号和位号分别加上0xA0就是GB2312编码。例如最后一个码位是9494,区号和位号分别转换成十六进制是5E5E,0x5E+0xA0=0xFE,所以该码位的GB2312编码是FEFE。


   GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个

全部编码分为三大部分:

    1. 汉字区。包括:
a. GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。
b. GB 13000.1 扩充汉字区。包括:
(1) GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。
(2) GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。CJK 汉字在前,按 UCS 代码大小排列;增补的汉字(包括部首和构件)在后,按《康熙字典》的页码/字位排列。
(3) 汉字“〇”安排在图形符号区GBK/5:A996。

(4) 注意这里每个区是190个汉字

    2. 图形符号区。包括:
a. GB 2312 非汉字符号区。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符号外,还有 10 个小写罗马数字和 GB 12345 增补的符号。计符号 717 个。
b. GB 13000.1 扩充非汉字区。即 GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“〇”排列在此区。计符号 166 个。

    3. 用户自定义区:分为(1)(2)(3)三个小区。
(1) AAA1-AFFE,码位 564 个。
(2) F8A1-FEFE,码位 658 个。
(3) A140-A7A0,码位 672 个。
第(3)区尽管对用户开放,但限制使用,因为不排除未来在此区域增补新字符的可能性。


    为了验证GBK编码下面用C#写一段程序来验证:

    先上效果:

搜狗截图18年04月03日1153_1.png

    然后是代码:

private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
            byte[] word = Encoding.Default.GetBytes(textBox2.Text);
            
            byte[] buff1 = new byte[32];
            FileStream fs = new FileStream("gbk.DZK", FileMode.Open);
            int offsets;
            if (word[0] > 0x80)
            {
                int qh, ql;
                this.Text = "中文";
                qh = word[0] - 0x81;
                ql = word[1] - 0x41;
                //offsets = ((int)(word[0] - 0xa0 - 1) + (word[1] - 0xa0 - 1)) * 32;//int.Parse(textBox2.Text) * 32;
                offsets = (190 * qh + ql) * (16 * 2);
            }
            else {
                this.Text = "英文";
                byte[] stemp = Encoding.ASCII.GetBytes(textBox2.Text);
                offsets = 32+(int)stemp[0] * 32;
            }
            fs.Seek(offsets, SeekOrigin.Begin);
            //for (int i = 0; i < 16; i++) {
                fs.Read(buff1,0, 32);
           // }
                int j = 0;
            foreach (char s in buff1) {
                string str = j % 2==1 ? "\r\n" : "";
                j++;
                textBox1.Text = textBox1.Text + Convert.ToString(s, 2).PadLeft(8, '0') + str;
            }
            textBox1.Text = textBox1.Text.Replace("1", "◆");
            textBox1.Text = textBox1.Text.Replace("0", "◇");
            textBox1.Text += "\r\n" + offsets.ToString() + "|" + word[0].ToString() + "|" + word[1].ToString();
            fs.Close();
        }

代码中使用的字库是使用《ts3》字符制作软件生成的设置如下:

搜狗截图18年04月03日1157_2.png

    由于使用的是未注册的版本所以字体中有一个斜线。

分享给朋友:

相关文章

关于锂电池电容的研究(更新)

关于锂电池电容的研究(更新)

首先锂电池一般标称电压是:3.7v锂电充满电,大概会是4.2V或者4.3V.锂电放完电,大概会是3.0V。锂电放电图,是呈抛物线的,4.3V降到3.7V和3.7V降到3.0V,都是变化很快的。惟有3.7V左右的放电时间是最长的,几乎占到了3/4的时间。所以才会标3.7V的。 容量百分比% 电池电压 V 100 4.2 90 4.08 80 4 70 3.93 60...

ESP32使用SD卡注意事项

ESP32使用SD卡注意事项

有两种方法可以使用:上拉电阻为47K和上拉电阻为10K。                                           上拉电阻为47K。按照ESP32-CAM开发板的接法。           ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。