You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python与Arduino C++中将UCS2字符串转为可读文本(无第三方库)

UCS2十六进制字符串转可读文本(Python & Arduino C++ 无第三方库实现)

问题分析

你贴的代码逻辑完全偏离了UCS2的编码规则,硬编码了零散的计算逻辑,既没有通用性,也没正确处理UCS2的编码格式——UCS2每个字符对应4位十六进制字符(2字节),正确做法是把输入字符串按每4位一组拆分,每组转成Unicode码点后再转成可读字符。

Python 实现

def ucs2_hex_to_text(ucs2_hex):
    result = []
    # 按每4个字符分割,每个UCS2字符占2字节(4位十六进制)
    for i in range(0, len(ucs2_hex), 4):
        # 截取4位十六进制子串,转成Unicode码点
        code_point = int(ucs2_hex[i:i+4], 16)
        # 转成对应字符加入结果
        result.append(chr(code_point))
    return ''.join(result)

# 测试你的输入字符串
st = "041204410451002004210443043F04350440003A00200031003300200413041100200438043D044204350440043D043504420430002C00200031003500300020043C0438043D00200030002004410435043A0020043D04300020043C043E04310438043B044C043D044B043500200420041A00200434043E002000320037002E00300038002E00320032"
print(ucs2_hex_to_text(st))

运行后会输出:ВАЯ Супер: 13 ГБ интернета, 150 мин 0 сек на мобильные РК до 27.08.22

原代码问题说明

  • 只针对固定的"0412"写死逻辑,无法处理整个输入字符串
  • 错误拆分单个十六进制位进行无意义计算,完全不符合UCS2的编码转换规则
  • 没有通用性,换个字符就完全失效

Arduino C++ 实现

Arduino需要手动拆分字符串,将每组十六进制转成整数后,再转成UTF-8字符(因为Arduino串口默认支持UTF-8显示):

String ucs2HexToText(String ucs2Hex) {
  String result = "";
  // 先判断字符串长度是否为4的倍数,避免出错
  if (ucs2Hex.length() % 4 != 0) {
    return result;
  }
  
  for (int i = 0; i < ucs2Hex.length(); i += 4) {
    // 截取4位十六进制子串
    String hexChunk = ucs2Hex.substring(i, i+4);
    // 十六进制转16位整数
    uint16_t codePoint = strtol(hexChunk.c_str(), NULL, 16);
    // 将Unicode码点转成UTF-8字符(覆盖U+0000到U+FFFF范围)
    if (codePoint <= 0x7F) {
      result += (char)codePoint;
    } else if (codePoint <= 0x7FF) {
      result += (char)(0xC0 | ((codePoint >> 6) & 0x1F));
      result += (char)(0x80 | (codePoint & 0x3F));
    } else {
      result += (char)(0xE0 | ((codePoint >> 12) & 0x0F));
      result += (char)(0x80 | ((codePoint >> 6) & 0x3F));
      result += (char)(0x80 | (codePoint & 0x3F));
    }
  }
  return result;
}

void setup() {
  Serial.begin(9600);
  String st = "041204410451002004210443043F04350440003A00200031003300200413041100200438043D044204350440043D043504420430002C00200031003500300020043C0438043D00200030002004410435043A0020043D04300020043C043E04310438043B044C043D044B043500200420041A00200434043E002000320037002E00300038002E00320032";
  Serial.println(ucs2HexToText(st));
}

void loop() {
  // 空循环
}

注意:要在Arduino串口监视器的编码设置里选UTF-8,才能正确显示西里尔字母,否则会出现乱码。

内容的提问来源于stack exchange,提问作者Sherlock_201

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:16:03