我正在尝试找到一种在 python 中实现这一点的方法: CyberChef 示例
我想将 UTF-8 转换为 UTF-7
示例:
<root><test>aaa</test><hel>asd</hel></root>
输出应为 +ADw-root+AD4-+ADw-test+AD4-aaa+ADw-/test+AD4-+ADw-hel+AD4-asd+ADw-/hel+AD4-+ADw-/root+AD4-
我尝试使用编解码器和解码('utf-7'),但这只是按原样返回字符串。
谢谢!
<
和 >
属于 UTF-7 (RFC 2152) 所谓的“可选直接字符”。这些字符可以直接编码为其 ASCII 等效项,也可以使用 Unicode 移位编码进行编码。
例如,当编码为 UTF-7 时,Python 选择对
<
使用直接编码:
>>> "<".encode("utf-7")
b'<'
从 UTF-7 解码字节时,Python 会很乐意处理直接编码或 Unicode 移位编码
<
:
>>> b"+ADw-".decode("utf-7")
'<'
>>> b"<".decode("utf-7")
'<'
如果您想获得
<
(或其他可选的直接字符)的 Unicode 移位编码,您需要手动将直接编码字符转换为其 Unicode 移位等效项,或使用提供更精细的不同 UTF-7 实现- 粒度控制。
要手动将
<
和 >
从直接编码转换为其 Unicode 移位编码,您只需使用 bytes.replace
:
text = "<root><test>aaa</test><hel>asd</hel></root>"
payload = text.encode("utf-7").replace(b"<", b"+ADw-").replace(b">", b"+AD4-")
>>> print(payload)
b'+ADw-root+AD4-+ADw-test+AD4-aaa+ADw-/test+AD4-+ADw-hel+AD4-asd+ADw-/hel+AD4-+ADw-/root+AD4-'
>>> text == payload.decode("utf-7")
True