存储原始文件名该用哪种XML编码?如何兼容非空任意字节?
解决方案:通过Base64编码存储原始字节
XML的核心规范要求文档必须是符合指定编码的有效字符流——哪怕是CDATA区块,也只是跳过标签解析,不允许包含编码无效的字节(比如你用到的单独\xf1,这是不完整的UTF-8序列),所以直接存储原始非UTF-8字节必然触发解析错误。
要在XML中存储除NUL外的任意字节,最可靠的方式是将原始字节编码为Base64格式,把二进制数据转成XML完全兼容的ASCII字符,解析时再解码还原。
步骤1:修改Shell脚本生成Base64编码的XML
把原始文件名转成Base64后写入XML:
#!/bin/sh filename=$(printf "\xf1.mp3") # 对文件名做Base64编码,-n避免添加换行符 encoded_filename=$(echo -n "$filename" | base64) cat <<EOF > test.xml <?xml version="1.0" encoding="UTF-8"?> <root> <music>🎵</music> <file>$encoded_filename</file> </root> EOF
步骤2:Python解析并还原原始文件名
读取XML后解码Base64,得到原始字节:
import xml.dom.minidom import base64 dom = xml.dom.minidom.parse('test.xml') file_node = dom.getElementsByTagName('file')[0] # 获取编码后的字符串 encoded_str = file_node.firstChild.data # 解码回原始字节 original_filename = base64.b64decode(encoded_str) print(original_filename) # 输出: b'\xf1.mp3'
为什么不能直接存原始字节?
XML标准(包括UTF-8编码要求)严格禁止文档中出现编码无效的字节序列。单独的\xf1属于不合法的UTF-8字节(UTF-8中\xf1需要后续两个字节组成完整序列),无论放在元素内容还是CDATA里,都会被解析器判定为格式错误。不存在绕过这个限制的方法,因为这违反了XML的基础语法规则。
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

