OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3459|回复: 7

STM32 如何根据 汉字 的 GBK编码,查到对应的汉字

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-21
在线时间
3 小时
发表于 2020-9-22 13:58:16 | 显示全部楼层 |阅读模式
5金钱
STM32 如何根据 汉字 的 GBK编码,查到对应的汉字: 比如对方通过总线传来 一个汉字的  GBK 编码  (加入 “哈”的 GBK编码 是 02  A6),  怎样把这个 编码  转成 汉字 (哈),然后通过 发送 出去 给 其他文字处理 服务器:     收到字符串 char str[2] ,其中, str[0] = 0x02; str[1] = 0xA6

       convert(&str)  --->对应汉字 “哈”

     send_HTTP(“哈",“xxx.com/ASR/...API”);

     是要把GKB的对应表  放到Flash中?  到那里  GKB 表头文件?  怎么加入STM工程?

   谢谢!





最佳答案

查看完整内容[请看2#楼]

1.任何代码都不“认识”汉字,只认识二进制的0和1(16进制方便表示) 2.汉字GBK编码以2个字节内码的形式表示汉字 第一字节0x81 - 0xFE(126个,称为区) 第二字节分为两部分: 0x40 - 0x7E (63个) 0X80 - 0XFE(127个) 每区63+127=190个汉字,共126*190=23940个汉字(基本使用足够了) 这里汉字其实是 0x81 0x40(第一个汉字) 0x81 0x41(第二个汉字)......0xfe 0x ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6657
金钱
6657
注册时间
2015-8-25
在线时间
1034 小时
发表于 2020-9-22 13:58:17 | 显示全部楼层
1.任何代码都不“认识”汉字,只认识二进制的0和1(16进制方便表示)
2.汉字GBK编码以2个字节内码的形式表示汉字
      第一字节0x81 - 0xFE(126个,称为区)
      第二字节分为两部分: 0x40 - 0x7E (63个)
                                        0X80 - 0XFE(127个)
   每区63+127=190个汉字,共126*190=23940个汉字(基本使用足够了)
  这里汉字其实是  0x81 0x40(第一个汉字) 0x81 0x41(第二个汉字)......0xfe 0xfe(第23940个汉字)的固定顺序对应固定的汉字顺序,这个网上可以查到
3.GBK内码,要发送出去,那就是接收方负责解析(先判断是否大于0x80,若小于则是ASCII码,若大于则跟后面一字节一起当作汉字解析);要是自己是接受方,也是将接受到的数组做一样的判断
4.你已经得到汉字的GBK编码了,也就是说你已经知道是哪个汉字了。把这个编码给处理云,处理云应该也是根据GBK编码识别汉字的
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8634
金钱
8634
注册时间
2020-5-11
在线时间
4082 小时
发表于 2020-9-22 15:12:43 | 显示全部楼层
利用VB从字库中提取汉字字模代码.pdf (160.09 KB, 下载次数: 8)
专治疑难杂症
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14407
金钱
14407
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-9-22 15:23:50 | 显示全部楼层
看下原子的汉字显示例程那个章节
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-21
在线时间
3 小时
 楼主| 发表于 2020-9-22 15:45:09 | 显示全部楼层
    大家 可能 理解 错了 ,我不是 要 字 模 :   我从通信线上 得到  汉字 的  GBK码(两个Byte)   比如   01  A5  它实际对应的 汉字   是 “哈”, 然后  我要访问 文字处理云   

   处理云的代码 如下 : 这里是 “欢迎 使用 ”、但我在 这段 代码 之前 的得到的是  “02A6  01A8 03A7 02B6“  不知道怎么 通过查表把他们变成 “欢迎 使用”

   #define TTS_TEXT "欢迎使用”

   nt data_len = snprintf(request_data, 1024, "lan=zh&cuid=ESP32&ctp=1&tok=%s&tex=%s", baidu_access_token, TTS_TEXT);
   
    esp_http_client_set_post_field(http_client, request_data, data_len);
回复

使用道具 举报

11

主题

2143

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4880
金钱
4880
注册时间
2015-1-10
在线时间
611 小时
发表于 2020-9-22 16:08:51 | 显示全部楼层
STM32LWIP 发表于 2020-9-22 15:45
大家 可能 理解 错了 ,我不是 要 字 模 :   我从通信线上 得到  汉字 的  GBK码(两个Byte)   比如  ...

只是编码方式不同而已,比如你说的02A6,GBK编码是哈,在UTF-8里面又是另一个东西,对于控制器来说都是二进制的,在处理的时候只要知道从哪个字节开始是你要的东西,然后保存再通过你想要的编码方式显示出来就行,02A6你可以显示成二进制、八进制、十进制、十六进制、GBK、UTF-8、UTF-16等等
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8634
金钱
8634
注册时间
2020-5-11
在线时间
4082 小时
发表于 2020-9-22 17:18:30 | 显示全部楼层
本帖最后由 LcwSwust 于 2020-9-22 17:26 编辑

莫非是这样查表:
  1. //求数组元素个数
  2. #define ARRLEN(arr) (sizeof(arr)/sizeof(arr[0]))
  3. //定义结构体类型
  4. #define CLASS(name_)  typedef struct name_ name_;struct name_
  5. CLASS(C2Z)
  6. {
  7.         U16 id;
  8.         U8 zi[2];
  9. };
  10. code C2Z c2ztab[]={
  11. 0x02A6,"欢",
  12. 0x01A8,"迎",
  13. ......
  14. };

  15. U8* convert(U16 c)
  16. {
  17.         for(i=0;i<ARRLEN(c2ztab);i++)//
  18.         {               
  19.                 if(c==c2ztab[i].id)
  20.                         return c2ztab[i].zi;
  21.         }        
  22. }
复制代码


专治疑难杂症
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-21
在线时间
3 小时
 楼主| 发表于 2020-9-22 17:37:06 | 显示全部楼层
感谢大家的回复! 谢谢 !!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 00:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表