1.编码/汉字转换:就是为了将平常常见的汉字集编码转换成对应的十六进制。可以实现输入汉字查询对应的编码,或者输入编码查询对应的汉字。一次最多查询99个字或编码:输入汉字时连续输入即可;输入编码时,十进制编码之间用空格分隔(也可以是逗号或分号),其它进制编码连续输入即可。
2.进制说明:二进制和十六进制是符合计算机规则的字节序编码;十进制是对十六进制编码的整体转换。因此,在进行连续识别时,十进制不适用。
3.字符集编码是指对多个字符(通常在几十到几万个不等)进行整合封装成一个文件所使用的编码,外部程序通过这种编码就可以从字符集文件中调用指定的字符。我们常见的计算机字体文件就使用了字符集编码,通过输入法输入文字或者浏览网页时都会通过指定的字符集编码从字体文件中调用字符。
4.以下是常见的汉字字符集编码:
(1)GB2312编码:1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。
(2)BIG5编码:台湾地区繁体中文标准字符集,采用双字节编码,共收录13053个中文字,1984年实施。
(3)GBK编码:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
(4)GB18030编码:2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。
(5)Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。Unicode采用四个字节为每个字符编码。
(6)UTF-8和UTF-16编码:Unicode编码的转换格式,可变长编码,相对于Unicode更节省空间。UTF-16的字节序有**大尾序(big-endian)和小尾序(little-endian)**之别。
今天的上位机主要实现:GB2312编码的转换
1.窗体设计
2.汉字到编码的转换
2.1 直接在转换按钮下写事件
汉字–》编码
(1)转换的原理是:需要将汉字先转换成UTF-8编码,再转换为标准的GB2312的汉字编码,再将其转换为标准化的形式显示
(2)gb2312 —》UTF-8 —》十六进制
String str = textBox1.Text;//获取文本框中的汉字内容Encoding FromEncoding = Encoding.GetEncoding("UTF-8");//设置需要转换的编码方式Encoding ToEncoding = Encoding.GetEncoding("gb2312")//设置需要转换的编码方式byte[] FromBytes = FromEncoding.GetBytes(str);//将汉字内容转换为UTF-8形式byte[] Tobytes = Encoding.Convert(FromEncoding, ToEncoding, FromBytes);//进行UTF-8编码到GB2312的编码foreach (byte mybyte in Tobytes)//遍历整个编码数组{string str1 = mybyte.ToString("x").ToUpper();//十进制的数转换为十六进制的字符并大写textBox2.Text += "0x" + (str1.Length == 1 ? "0" + str1 : str1) + " ";//标准化显示}
直接在转换的按钮下写汉字转编码的函数,这样就不用单独封装一个函数了。
2.2 封装一个汉字转编码的函数
private byte[] StringToByte(string mystring){//设置需要转换的编码方式,为UTF-8Encoding FromEncoding = Encoding.GetEncoding("UTF-8");//设置需要转换的编码方式,为GB2312Encoding ToEncoding = Encoding.GetEncoding("GB2312");//将获取的textBox1.Text控件中的汉字内容,传入的汉字转换为UTF-8格式的编码byte[] FromBytes = FromEncoding.GetBytes(mystring);//将UTF-8转换为GB2312byte[] ToBytes = Encoding.Convert(FromEncoding, ToEncoding, FromBytes);return ToBytes;}
1.Encoding.Convert(): 将字节数组内某个范围的字节从一种编码转换为另一种编码。
(1)参数:
(1.1)srcEncoding:源数组 bytes 的编码
(1.2)dstEncoding:输出数组的编码。
(1.3)bytes:要转换的字节数组。
(1.4)index:要转换的 bytes 中第一个元素的索引.
(1.5)count:要转换的字节数。
(2)返回结果: 一个 System.Byte 类型的数组,其中包含将 bytes 中某个范围的字节从 srcEncoding 转换为 dstEncoding 的结果。
private void button1_Click(object sender, EventArgs e){//获取文本框中的汉字内容.byte[] MyStringToByte = StringToByte(textBox1.Text);//将接收的框清空textBox2.Text = "";//遍历整个数组,即就是遍历textBox1.Text获取的所有汉字。foreach (byte MyByte in MyStringToByte){//十进制的数转换为十六进制的字符并大写,在进行连续识别时,十进制不适用。string str = MyByte.ToString("x").ToUpper();//标准化格式输出。textBox2.Text += "0x" + ((str.Length == 1) ? "0" + str : str) + " ";}}
2.3 运行结果
2.4 验证
打开如下链接
汉字字符集编码链接:/bianma/zifuji.php.
3.编码到汉字的转换
编码到汉字的转换:其实就是上述的逆过程。
(1)原理:需要先去除标准化的形式显示,只保留具体的编码,然后从GB2312转换为UTF-8的编码,再编码进行解析为汉字内容
(2)0x** —>去掉0x —>GB2312—>UTF-8—>汉字
3.1 直接在转换按钮下写事件
private void button2_Click(object sender, EventArgs e){byte[] FromBytes = new byte[textBox1.Text.Length / 2];//用于保存汉字编码内容try{string Buffer = textBox1.Text;//获取文本框中的汉字编码内容Buffer = Buffer.Replace("0x", "");//使用null来代替0x,去除格式Buffer = Buffer.Replace(" ", string.Empty);//去除空格for (int i = 0; i < Buffer.Length / 2; i++)//进行截取每个编码的两位{FromBytes[i] = Convert.ToByte(Buffer.Substring(i * 2, 2), 16);//转化为比特形式}Encoding FromEncoding = Encoding.GetEncoding("gb2312");//设置需要转换的编码方式Encoding ToEncoding = Encoding.GetEncoding("UTF-8");//设置需要转换的编码方式byte[] Tobytes = Encoding.Convert(FromEncoding, ToEncoding, FromBytes);//进行GB2312编码到UTF-8的编码string mystr = ToEncoding.GetString(Tobytes);//转换为汉字内容textBox2.Text = mystr;//进行显示}catch{MessageBox.Show("数据转换错误,请输入数字.", "错误");}}
3.2 封装一个编码转汉字的函数
private string ByteToString(byte[] Bytes){String MyString;//设置需要转换的编码方式,为UTF-8Encoding FromEncoding = Encoding.GetEncoding("GB2312");//设置需要转换的编码方式,为GB2312Encoding ToEncoding = Encoding.GetEncoding("UTF-8");//将传入的十六进制编码,由GB2312转换为UTF-8格式。byte[] ToBytes = Encoding.Convert(FromEncoding, ToEncoding, Bytes);//将得到的数转换为字符串,汉字MyString = ToEncoding.GetString(ToBytes);return MyString;}
private void button2_Click(object sender, EventArgs e){//定义一个数组,来存取编码内容byte[] data = new byte[textBox3.Text.Length / 2];try{//获取文本框中编码内容。string buffer = textBox3.Text;//去除格式//使用null来代替0x,去除格式buffer = buffer.Replace("0x","");//去除空格buffer = buffer.Replace(" ",string.Empty);//遍历每一个编码内容。每两位进行读取。for (int i = 0; i < buffer.Length / 2; i++){//将获取的内容转换为十六进制格式data[i] = Convert.ToByte(buffer.Substring(i * 2, 2), 16);}textBox4.Text = ByteToString(data);}catch (Exception){MessageBox.Show("数据转换错误", "错误提示");}}
3.3 运行结果
4.清除事件
4.1 清除汉字转编码
private void button3_Click(object sender, EventArgs e){textBox1.Clear();textBox2.Clear();}
4.2 清楚编码转汉字
private void button4_Click(object sender, EventArgs e){textBox3.Clear();textBox4.Clear();}
4.3 清除所有
private void button5_Click(object sender, EventArgs e){textBox1.Clear();textBox2.Clear();textBox3.Clear();textBox4.Clear();}
4.4 运行结果
5.拓展
也可以转换其他编码方式,只需要把代码里对应的转换形式变化即可。