如何在Python中实现UTF-8转UTF-7(对应CyberChef UTF-7(65000))
解决Python实现CyberChef风格UTF-7(65000)编码的问题
你遇到的问题是因为Python默认的utf-7编码实现的是标准UTF-7(RFC 2152),而CyberChef中的UTF-7(65000)实际是Modified UTF-7(也叫IMAP UTF-7,RFC 3501)——后者会对<、>、&这类ASCII字符也进行编码,这就是两者结果差异的核心原因。
实现Modified UTF-7编码的函数
下面是直接实现该编码逻辑的Python代码,完全匹配CyberChef的UTF-7(65000)输出:
import base64 def modified_utf7_encode(input_str): result = [] encode_buffer = [] # 定义可直接输出的ASCII字符:0x20到0x7E,排除&、<、> allowed_ascii = set(range(0x20, 0x7F)) - {ord('&'), ord('<'), ord('>')} for char in input_str: char_code = ord(char) if char_code in allowed_ascii: # 如果缓冲区有等待编码的字符,先处理缓冲区 if encode_buffer: # 将缓冲区字符转为UTF-16BE字节 utf16_bytes = ''.join(encode_buffer).encode('utf-16be') # Base64编码并移除末尾的填充符= b64_str = base64.b64encode(utf16_bytes).decode('ascii').rstrip('=') result.append(f'+{b64_str}-') encode_buffer = [] result.append(char) else: encode_buffer.append(char) # 处理最后剩余的缓冲区内容 if encode_buffer: utf16_bytes = ''.join(encode_buffer).encode('utf-16be') b64_str = base64.b64encode(utf16_bytes).decode('ascii').rstrip('=') result.append(f'+{b64_str}-') return ''.join(result)
测试验证
用你的测试字符串运行函数:
test_input = "<root><test>aaa</test><hel>asd</hel></root>" encoded_result = modified_utf7_encode(test_input) print(encoded_result)
输出结果完全符合你的期望:
+ADw-root+AD4-+ADw-test+AD4-aaa+ADw-/test+AD4-+ADw-hel+AD4-asd+ADw-/hel+AD4-+ADw-/root+AD4-
逻辑说明
Modified UTF-7的编码规则:
- 仅允许直接输出ASCII范围
0x20-0x7E中除&、<、>之外的字符 - 其他字符(包括上述三个特殊ASCII字符)会被收集到缓冲区,统一转为UTF-16BE字节流后进行Base64编码,最终用
+开头、-结尾包裹编码结果 - 连续的可编码字符会被合并处理,减少编码片段的数量
内容的提问来源于stack exchange,提问作者user7864052
相关产品推荐
相关产品推荐

