HDF5:如何从h5dump输出解码UTF-8编码字符串?
解码HDF5属性输出的UTF-8字符方法
这问题我之前处理HDF5元数据时也碰到过,h5ls/h5dump对非ASCII字节的输出格式确实有点反直觉——它把每个UTF-8字节当作带符号32位整数转成了八进制字符串,所以才会出现一堆37777777前缀。下面是具体的还原步骤:
1. 先搞懂输出的编码逻辑
每个\37777777xxx序列对应一个UTF-8字节:
- 比如
\37777777703其实是UTF-8字节0xC3的32位带符号补码八进制表示;\37777777644是0xA4的补码八进制。 - 本质是:8位的字节被扩展成32位带符号整数(高位补1,因为这些字节都是大于127的UTF-8续字节/首字节),然后转成八进制输出。
2. 分步还原的具体操作
步骤1:拆分转义序列
把工具输出的字符串按\分割,得到单个的八进制序列:
比如你的输入:
\37777777703\37777777644\37777777703\37777777666\37777777703\37777777674\37777777703\37777777637
拆分后得到:37777777703, 37777777644, 37777777703, 37777777666, 37777777703, 37777777674, 37777777703, 37777777637
步骤2:把八进制序列转成原始字节
对每个序列,先转成带符号整数,再取低8位(和0xFF做按位与),就能得到原始的UTF-8字节值:
37777777703→ 转整数是-61→-61 & 0xFF = 0xC337777777644→ 转整数是-92→-92 & 0xFF = 0xA4
这两个字节组合起来就是UTF-8的ä,和你已知的对应上了。
步骤3:组合字节并解码为UTF-8
把所有转换后的字节按顺序拼成字节数组,再用UTF-8解码,就能得到原始字符串。
3. 用Python一键还原的代码
# 复制h5ls/h5dump输出的属性内容 h5_attr_output = r"\37777777703\37777777644\37777777703\37777777666\37777777703\37777777674\37777777703\37777777637" # 拆分每个八进制转义片段 octal_fragments = h5_attr_output.split("\\")[1:] # 跳过第一个空元素 # 转换为原始字节数组 raw_bytes = bytes(int(frag, 8) & 0xFF for frag in octal_fragments) # 解码为UTF-8字符串 original_text = raw_bytes.decode("utf-8") print(original_text) # 输出:äöüß
4. 手动验证每个字符的对应关系
为了确认逻辑没问题,可以对照UTF-8编码表:
ä→ UTF-80xC3 0xA4→ 对应输出序列\37777777703+\37777777644ö→ UTF-80xC3 0xB6→ 对应\37777777703+\37777777666ü→ UTF-80xC3 0xBC→ 对应\37777777703+\37777777674ß→ UTF-80xC3 0x9F→ 对应\37777777703+\37777777637
完全匹配你的输入,所以这个方法绝对靠谱。
内容的提问来源于stack exchange,提问作者Dominic
相关产品推荐
相关产品推荐

