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

存储原始文件名该用哪种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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:12:52