Python中Base64解码后无法解析JSON且重新编码失败问题
解决Base64解码后含隐藏字符无法解析JSON的问题
1. 定位隐藏字符类型
先解码后逐个检查字符编码,找出不可见的隐藏字符:
import base64 # 替换为你的Base64字符串 base64_str = "YOUR_BASE64_STRING_HERE" decoded_bytes = base64.b64decode(base64_str) # 打印每个字节的十六进制和对应字符,排查隐藏字节 for idx, byte in enumerate(decoded_bytes): print(f"索引{idx}: 十六进制{hex(byte)} 字符: {repr(chr(byte))}") # 解码为字符串后,检查Unicode码点 decoded_str = decoded_bytes.decode() for idx, char in enumerate(decoded_str): print(f"索引{idx}: Unicode码点{ord(char)} 字符: {repr(char)}")
通过输出可明确隐藏字符是控制字符、零宽字符还是其他不可见类型。
2. 清除隐藏字符
根据排查结果,用以下方法过滤不可见字符:
- 方法一:保留可打印字符
直接筛选出isprintable()为True的字符:
cleaned_str = ''.join([c for c in decoded_str if c.isprintable()])
- 方法二:正则匹配排除控制字符
精准移除ASCII和扩展ASCII控制字符:
import re # 移除所有控制字符(\x00-\x1F为ASCII控制符,\x7F-\x9F为扩展控制符) cleaned_str = re.sub(r'[\x00-\x1F\x7F-\x9F]', '', decoded_str)
- 特殊情况:处理UTF-8 BOM
如果字符串开头是UTF-8字节顺序标记(\ufeff),直接截断开头:
if decoded_str.startswith('\ufeff'): cleaned_str = decoded_str[1:]
3. 验证JSON解析
清理后尝试解析为JSON,确认是否正常:
import json try: json_data = json.loads(cleaned_str) print("JSON解析成功:", json_data) except json.JSONDecodeError as e: print(f"解析失败:{e}")
4. 重新编码的正确方式
若需重新编码为Base64,先将清理后的字符串转为UTF-8字节,再执行编码:
# 转为UTF-8字节 encoded_bytes = cleaned_str.encode('utf-8') # Base64编码并转为字符串 new_base64 = base64.b64encode(encoded_bytes).decode('utf-8')
内容的提问来源于stack exchange,提问作者Prak
相关产品推荐
相关产品推荐

