C#上位机(编码/汉字转换)

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-8
   Encoding FromEncoding = Encoding.GetEncoding("UTF-8");
   //设置需要转换的编码方式,为GB2312
   Encoding ToEncoding = Encoding.GetEncoding("GB2312");
   //将获取的textBox1.Text控件中的汉字内容,传入的汉字转换为UTF-8格式的编码
   byte[] FromBytes = FromEncoding.GetBytes(mystring);
   //将UTF-8转换为GB2312
   byte[] 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 验证

打开如下链接
汉字字符集编码链接:https://www.qqxiuzi.cn/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-8
    Encoding FromEncoding = Encoding.GetEncoding("GB2312");
    //设置需要转换的编码方式,为GB2312
    Encoding 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.拓展

也可以转换其他编码方式,只需要把代码里对应的转换形式变化即可。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用 C# 和 WinForms 的示例代码,用于上位机开发TCP/IP协议的WinForm程序: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms; namespace TCPClientApp { public partial class MainForm : Form { private TcpClient tcpClient; private NetworkStream networkStream; private byte[] buffer; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 创建TCP客户端 tcpClient = new TcpClient(); buffer = new byte[1024]; } private void btnConnect_Click(object sender, EventArgs e) { try { // 连接到服务器 string ipAddress = txtServerIP.Text; int port = int.Parse(txtServerPort.Text); tcpClient.Connect(IPAddress.Parse(ipAddress), port); // 获取网络流 networkStream = tcpClient.GetStream(); lblStatus.Text = "已连接到服务器"; } catch (Exception ex) { lblStatus.Text = "无法连接到服务器:" + ex.Message; } } private void btnSend_Click(object sender, EventArgs e) { try { // 发送数据到服务器 string data = txtData.Text; byte[] dataBytes = Encoding.ASCII.GetBytes(data); networkStream.Write(dataBytes, 0, dataBytes.Length); // 接收服务器响应 int bytesRead = networkStream.Read(buffer, 0, buffer.Length); string response = Encoding.ASCII.GetString(buffer, 0, bytesRead); txtResponse.Text = response; } catch (Exception ex) { lblStatus.Text = "发送数据时发生错误:" + ex.Message; } } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 关闭网络流和TCP客户端 networkStream?.Close(); tcpClient?.Close(); } } } ``` 这个示例代码创建了一个名为 `MainForm` 的 WinForms 窗体。在窗体加载时,它创建了一个 `TcpClient` 对象和一个用于接收数据的缓冲区。 窗体中有两个按钮,`btnConnect` 用于连接到服务器,`btnSend` 用于发送数据并接收服务器的响应。 点击 `btnConnect` 按钮时,它会尝试连接到指定的服务器IP地址和端口号,并获取网络流。如果连接成功,状态标签 `lblStatus` 将显示已连接到服务器的消息。 点击 `btnSend` 按钮时,它会将文本框 `txtData` 中的数据发送到服务器,并接收服务器的响应。响应数据将显示在文本框 `txtResponse` 中。 在窗体关闭时,它会关闭网络流和TCP客户端。 请注意,这只是一个示例代码,实际的上位机开发可能需要更多的功能和处理逻辑。希望对您有所帮助!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值