巧用移位运算符获取汉字编码值


  • Title:《巧用移位运算符获取汉字编码值》
  • Author:Hugu
  • Started Date:August 12th.2019.
  • Finished Date:August 13th.2019.
  • Recommend link:千千秀字
  • PS:文末附资源链接

背景

移位运算符

  • 移位运算符在程序设计中,是位操作运算符的一种

  • 移位运算符分为左移位运算符"<<“和右移位运算符”>>",形如:X << NX >> N

  • 在C#中X可以是:int、uint、long、ulong、byte、sbyte、short、ushort,其中byte、sbyte、short、ushort类型的值在进行移位操作后的类型将自动转换成int类型

  • 其他类型数据的移位运算其本质还是对二进制的移位运算

  • 二进制每次向左移1位就相当于乘以2,每次向右移1位就相当于除以2

  • 举例如下:

    问题:

    • 3(O) << 2

    计算过程:

    1. 3(O)转换为二进制为:0011
    2. 二进制数值各个位整体左移两位(左端溢出丢弃,右端补"0")后得到:1100
    3. 再将移位后的二进制数值转换为十进制数值为:12(O)
    4. 也即:3 << 2 = 12

汉字编码

​  汉字编码(Chinese character encoding)是为汉字设计的一种便于输入计算机的代码。

编码分类

​  计算机中汉字的表示也是用二进制,根据应用目的的不同,汉字编码分为外码交换码机内码字形码

外码(输入码)

​  外码也叫输入码,是用来将汉字输入到计算机中的一组键盘符号。常用的输入码有拼音码、五笔字型码、区位码、电报码等

特点

  • 编码规则简单
  • 易学好记
  • 操作方便
  • 重码率低
  • 输入速度快
交换码(国际码)

​  计算机内部处理的信息都是二进制代码表示的,汉字也不例外。而二进制代码使用起来很不方便,于是需要采用信息交换码。GB2312即为国际码。

  • GB2312编码:1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。
  • BIG5编码:台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。
  • GBK编码:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
  • GB18030编码:2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。
  • Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。
机内码

​​  根据国际码的规定,每个汉字都有确定的二进制代码,在微机内部汉字代码都用机内码,在键盘上记录汉字代码也使用机内码。

字形码

​  字形码是汉字的输出码,输出汉字时都采用图形方式,无论汉字的笔画多少,每个汉字都可以卸载同样大小的方块中。通常用16×16点阵来显示汉字。

地址码

​  汉字地址码是指汉字库中存储汉字字形信息的逻辑地址码。它与汉字机内码有着简单的对应关系,以简单内码到地址码的转换。

汉字编码之间的关系

汉字编码之间的关系

操作环境

编程环境

  • VS2017
  • .Net Framework 4.5

运行环境

  • Win10

设计实现

界面设计:

设计界面

代码设计:

using System;
using System.Text;
using System.Windows.Forms;

namespace GetCode
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_Get_Click(object sender, EventArgs e)
        {
            try
            {
                //获得一个汉字字符
                char ch = txt_ch.Text[0];
                //使用gb2312编码方式获得字节序列
                byte[] gb2312_bt = Encoding.GetEncoding("gb2312").GetBytes(new Char[] { ch });
                //将字节序列的第一个字节向左移8位
                int n = (int)gb2312_bt[0] << 8;
                
                //第一个字节移8位后与第二个字节相加得到汉字编码
                n += (int)gb2312_bt[1];
                //显示汉字编码(十六进制)
                txt_Num.Text = Convert.ToString(n, 16);
            }
            catch (Exception)
            {
                //异常提示信息
                MessageBox.Show("请输入汉字字符!", "出现错误!");
            }
        }
    }
}

实现结果

操作结束

原理解析

  • char ch = txt_ch.Text[0];//ch变量存储“位”的Unicode编码>
  • byte[] gb2312_bt = Encoding.GetEncoding(“gb2312”).GetBytes(new Char[] { ch });//gb2312_bt变量数组中存储由ch编码得到的GB2312字节
  • int n = (int)gb2312_bt[0] << 8; //将字节左移八位(一个字节)
  • n += (int)gb2312_bt[1];//两个数值相加得到“位”的GB2312编码(十进制)
  • txt_Num.Text = Convert.ToString(n, 16);//编码转十六进制并显示

附录:

参考链接

有关字体编码/查询/加解密网站推荐

ps:
CSDN上传的资源现在无法自己设置积分,我将本博客的相关内容以百度网盘的形式进行分享,供大家参考学习。
链接:https://pan.baidu.com/s/113MQZmu14q2ZGyDWfda9pg
提取码:sl6z
(有效期至2019-12-31)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值