Python中如何解码一个未知编码的字符串?

字符串:'0101.┐╔░«┼«╚╦.mp3'

搞了半天,没弄成,实际上中间是中文


Python中如何解码一个未知编码的字符串?
8 回复

贴个二进制编码的看看


import chardet
from typing import Optional

def decode_unknown_string(byte_data: bytes) -> Optional[str]:
    """
    解码未知编码的字节数据
    
    参数:
        byte_data: 原始字节数据
        
    返回:
        解码后的字符串,如果解码失败则返回None
    """
    if not isinstance(byte_data, bytes):
        raise TypeError("输入必须是bytes类型")
    
    # 检测编码
    result = chardet.detect(byte_data)
    encoding = result['encoding']
    confidence = result['confidence']
    
    if encoding is None:
        print("无法检测到编码")
        return None
    
    print(f"检测到编码: {encoding} (置信度: {confidence:.2%})")
    
    try:
        # 尝试用检测到的编码解码
        decoded_str = byte_data.decode(encoding)
        return decoded_str
    except UnicodeDecodeError:
        print(f"用 {encoding} 解码失败,尝试常见编码...")
        
        # 备选编码列表
        common_encodings = ['utf-8', 'gbk', 'gb2312', 'gb18030', 
                           'big5', 'shift_jis', 'euc-jp', 'iso-8859-1']
        
        for enc in common_encodings:
            try:
                decoded_str = byte_data.decode(enc)
                print(f"使用备选编码 {enc} 解码成功")
                return decoded_str
            except UnicodeDecodeError:
                continue
        
        print("所有尝试的编码都解码失败")
        return None

# 使用示例
if __name__ == "__main__":
    # 示例1: UTF-8编码的字符串
    utf8_bytes = "你好,世界!".encode('utf-8')
    result1 = decode_unknown_string(utf8_bytes)
    print(f"解码结果1: {result1}\n")
    
    # 示例2: GBK编码的字符串
    gbk_bytes = "测试文本".encode('gbk')
    result2 = decode_unknown_string(gbk_bytes)
    print(f"解码结果2: {result2}\n")
    
    # 示例3: 混合编码的情况
    mixed_bytes = b'\xc4\xe3\xba\xc3'  # GBK编码的"你好"
    result3 = decode_unknown_string(mixed_bytes)
    print(f"解码结果3: {result3}")

核心思路:

  1. 先用chardet库自动检测编码(它通过统计分析字节模式来猜测编码)
  2. 如果检测失败或解码出错,就遍历常见编码列表手动尝试
  3. 优先使用检测结果,备选方案覆盖中文、日文、西欧等常见编码

注意点:

  • 输入必须是bytes类型,字符串需要先编码
  • chardet不是100%准确,置信度低时要谨慎
  • 备选编码列表可根据实际场景调整

一句话建议: 先用chardet检测,失败再遍历常见编码尝试。

知道中文就简单啦,遍历所有编码即可
https://imgur.com/YCPKD04

感谢各位回复,发帖之后又查了一下终于发现就是 cp437 编码😂,二楼厉害,我回去看看这个库

FYI,[Standard Encodings]( https://docs.python.org/3.6/library/codecs.html#standard-encodings) 列出了所有的 codecs,比 所使用的 encodings.aliases.aliases 多了几个没有别名的,而且还有对应的常用的语言。

![]( )

大佬,发现一个用你的方法也编不出来的字符串:08.����ű�

因为你发的这个已经软件 /浏览器不识别而替换掉了,参见 wikipedia
https://en.wikipedia.org/wiki/Specials_(Unicode_block)
� REPLACEMENT CHARACTER used to replace an unknown, unrecognized or unrepresentable character

回到顶部