如何在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
相关产品推荐
相关产品推荐

