V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sjmcefc2
V2EX  ›  程序员

请教如何判断字符被正确解码?

  •  
  •   sjmcefc2 · 2018-04-26 15:41:39 +08:00 · 1492 次点击
    这是一个创建于 2205 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学者请教,chardet 可以统计出字符的编码,但是如果字符非常短,貌似准确度就会降低。 如果有一个字符串 str 被 chardet 探测为某种编码,但其实本身 str 是另外一种编码,但又恰好不报异常。 这种情况怎么处理? 总感觉乱码是肉眼看到的,机器怎么探测乱码呢?

    第 1 条附言  ·  2018-04-27 10:04:37 +08:00

    还有一个问题是我用 python 来对每行的字符串 split 后进行 chardet 判断转换,结果发现到了某一行,就会出异常。但是单独检查这一行,却能正确通过。 思路是先 chardet 判断,如果异常则用 utf-8 默认解码之后再编码。待清理的数据比较特殊,一行里有可能有好几个编码。。。。。

    for f in line.split('|'): 
        try: 
            print f.decode(chardet.detect(f)['encoding']).encode('utf-8') 
        except: 
            print f.decode('utf-8').encode('utf-8')
    
    第 2 条附言  ·  2018-04-27 10:05:18 +08:00
    当是上述编码的效率真的不高。。。。。有没有办法提高呢?
    6 条回复    2018-04-28 11:54:05 +08:00
    Arnie97
        1
    Arnie97  
       2018-04-27 02:00:07 +08:00 via Android
    本来就是概率方法,如果文件很短就失效了。所有的 UTF-8 / GBK 字节流必然都能按照 1252 解码不爆异常
    sjmcefc2
        2
    sjmcefc2  
    OP
       2018-04-27 09:21:50 +08:00
    @Arnie97 一个字符“纠” 就被 chardet 判断成了 TIS-620.这样就失效了。
    UTF-8/GBK 都能被 windows 1250 解码的含义是,正确显示字符吗(肉眼看到的是正确的字符)?是不是可以说针对汉字,可以默认 windows 1250 来解码?

    一直觉得解码没有异常并不一定不是乱码?我这样理解对吗?
    如何才能真正的某字符串不是乱码呢?
    sjmcefc2
        3
    sjmcefc2  
    OP
       2018-04-27 10:03:13 +08:00
    还有一个问题是我用 python 来对每行的字符串 split 后进行 chardet 判断转换,结果发现到了某一行,就会出异常。但是单独检查这一行,却能正确通过。
    思路是先 chardet 判断,如果异常则用 utf-8 默认解码之后再编码。待清理的数据比较特殊,一行里有可能有好几个编码。。。。。
    for f in line.split('|'):
    try:
    print f.decode(chardet.detect(f)['encoding']).encode('utf-8')
    except:
    print f.decode('utf-8').encode('utf-8')
    Arnie97
        4
    Arnie97  
       2018-04-28 10:26:35 +08:00 via Android
    #2 不是能看到正确的字符,只是能够覆盖对应的码点罢了。如果你拿一个覆盖了全部 256 种情况的单字节编码的解码器,显然可以解码世界上一切的字节流而不报错,只不过结果都是乱码
    sjmcefc2
        5
    sjmcefc2  
    OP
       2018-04-28 11:35:20 +08:00
    @Arnie97 这就是最大的担忧,乱码是不是只能肉眼检查?
    sjmcefc2
        6
    sjmcefc2  
    OP
       2018-04-28 11:54:05 +08:00
    @Arnie97 如何应对实际上解码错误的问题呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1697 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 16:44 · PVG 00:44 · LAX 09:44 · JFK 12:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.