硬汉嵌入式论坛

 找回密码
 立即注册
查看: 947|回复: 2
收起左侧

[物联网] 怎么将接受的十六进制中文字符编码处理成汉字打包到cjson

[复制链接]

16

主题

33

回帖

81

积分

初级会员

积分
81
发表于 2024-11-4 14:04:22 | 显示全部楼层 |阅读模式
怎么将接受的十六进制中文字符编码处理成汉字打包到cjson,比如上位机发送一个设备名称:“测试机”,上位机按照某一种的编码(如utf-8)将 “测试机” 三个汉字转成16进制发过来,单片机收到后将16进制在转换成汉字,然后将汉字按照字符串放到cjson中,不知道这种能不能实现
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2024-11-4 15:06:32 | 显示全部楼层
关键词 json uncode编码
JSON 中针对 Unicode 字符的处理
这里所说的 Unicode 字符,准确而言指的是在 ASCII 范围之外的字符,也就是值大于 0x7F 的 Unicode 字符。
其实大部分情况下,UTF-8 已经成为现代编程语言约定俗成的标准了,因此在 JSON 序列化时,只要简单地对 Unicode 字符的值转为二进制然后按照网络字节序打包就可以了。
但是在某些情况下,当对端采用的不是 UTF-8,或者是对端采用的不是网络字节序时(比如对方是技术底下/落后、但却话语权强大的客户/合作商/集成商),这个时候,大家统一采用 ASCII 编码,就能够避免这些问题了。

那么 JSON 是怎么使用 ASCII 编码来传输 Unicode 的呢?从前文的转义其实就可以一窥端倪了——JSON 采用的是 \uXXXX 的形式来表示一个 Unicode 字符的。每个 Unicode 字符表示法中,XXXX 必须是4个十六进制数,即便高位为0也需要补全。通过这种方式,编码和传输 Unicode 字符。在 ASCII 为主的数据传输中,这种编码方式比较稳妥,并且不会额外增加过多的数据量。当然对于 Unicode 字符比较多的情况下(比如大量的中文),这就需要程序员考虑一下额外带来的网络花销了。
大于 0xFFFF 的 Unicode 字符的编码
读者可能会注意到了,\uXXXX 格式最大只能支持到 0xFFFF,但 Unicode 早就已经超过了这个范围。大于 65535 的字符要怎么表示呢?首先,绝对不是简单地采用 \uXXXXX,这会导致编码错误。
针对大于 65535 的字符,JSON 采用的是 UTF-16 编码。UTF-16 采用了 Unicode 的一个特性:不超过20位。
比如我们用 u 代表这样的一个字符,UTF-16 的处理方法如下:

    首先,u = u - 0x10000
    取 hi 等于做了减法之后的 u 的高10位:hi = (u & 0xFFC00) >> 10
    取 lo 等于做了减法之后的 u 的低10位:lo = u & 0x003FF
    高位加上 0xD800 后进行 \u 编码
    低位加上 0xDC00 后进行 \u 编码

举例说明:代表地球的颜文字符号 “🌍”,其编码值为 0x1F30D,按照 UTF-16 编码过程为:

    u = 0x1F30D - 0x10000 = 0xF30D,二进制:1111 0011 0000 1101
    高10位等于 0000111100,低10位等于 1100001101
    高位值 0x03C 做加法之后等于 0xD83C
    低位值 0x30D 做加法之后等于 0xDF0D
    最终编码为 \uD83C\uDF0D

比如以下的 JSON:
{
    "string":"我是地球🌍"
}

按照 ASCII 序列化之后,结果为:
{"string":"\u6211\u662F\u5730\u7403\uD83C\uDF0D"}
回复

使用道具 举报

16

主题

33

回帖

81

积分

初级会员

积分
81
 楼主| 发表于 2024-11-4 16:23:22 | 显示全部楼层
了解了,多谢,我试试
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 15:45 , Processed in 4.779190 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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