- Title:《巧用移位运算符获取汉字编码值》
- Author:Hugu
- Started Date:August 12th.2019.
- Finished Date:August 13th.2019.
- Recommend link:千千秀字
- PS:文末附资源链接
背景
移位运算符
-
移位运算符在程序设计中,是位操作运算符的一种
-
移位运算符分为左移位运算符"<<“和右移位运算符”>>",形如:X << N 或 X >> N
-
在C#中X可以是:int、uint、long、ulong、byte、sbyte、short、ushort,其中byte、sbyte、short、ushort类型的值在进行移位操作后的类型将自动转换成int类型
-
其他类型数据的移位运算其本质还是对二进制的移位运算
-
二进制每次向左移1位就相当于乘以2,每次向右移1位就相当于除以2
-
举例如下:
问题:
- 3(O) << 2
计算过程:
- 3(O)转换为二进制为:0011
- 二进制数值各个位整体左移两位(左端溢出丢弃,右端补"0")后得到:1100
- 再将移位后的二进制数值转换为十进制数值为:12(O)
- 也即: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点阵来显示汉字。
地址码
汉字地址码是指汉字库中存储汉字字形信息的逻辑地址码。它与汉字机内码有着简单的对应关系,以简单内码到地址码的转换。
汉字编码之间的关系
![汉字编码之间的关系](https://i-blog.csdnimg.cn/blog_migrate/2bb6e4a686db4369cdb7ddb966157b57.png)
操作环境
编程环境:
- VS2017
- .Net Framework 4.5
运行环境:
- Win10
设计实现
界面设计:
![设计界面](https://i-blog.csdnimg.cn/blog_migrate/c281f0260c097d4250cb522565271597.png)
代码设计:
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("请输入汉字字符!", "出现错误!");
}
}
}
}
实现结果
![操作结束](https://i-blog.csdnimg.cn/blog_migrate/232d092fa826d31e0a7ac400877f7fe7.png)
原理解析
- 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)