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

如何在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的编码规则:

  1. 仅允许直接输出ASCII范围0x20-0x7E中除&、<、>之外的字符
  2. 其他字符(包括上述三个特殊ASCII字符)会被收集到缓冲区,统一转为UTF-16BE字节流后进行Base64编码,最终用+开头、-结尾包裹编码结果
  3. 连续的可编码字符会被合并处理,减少编码片段的数量

内容的提问来源于stack exchange,提问作者user7864052

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:03:11