初学者请教,chardet 可以统计出字符的编码,但是如果字符非常短,貌似准确度就会降低。 如果有一个字符串 str 被 chardet 探测为某种编码,但其实本身 str 是另外一种编码,但又恰好不报异常。 这种情况怎么处理? 总感觉乱码是肉眼看到的,机器怎么探测乱码呢?
还有一个问题是我用 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')
1
Arnie97 2018-04-27 02:00:07 +08:00 via Android
本来就是概率方法,如果文件很短就失效了。所有的 UTF-8 / GBK 字节流必然都能按照 1252 解码不爆异常
|
2
sjmcefc2 OP @Arnie97 一个字符“纠” 就被 chardet 判断成了 TIS-620.这样就失效了。
UTF-8/GBK 都能被 windows 1250 解码的含义是,正确显示字符吗(肉眼看到的是正确的字符)?是不是可以说针对汉字,可以默认 windows 1250 来解码? 一直觉得解码没有异常并不一定不是乱码?我这样理解对吗? 如何才能真正的某字符串不是乱码呢? |
3
sjmcefc2 OP 还有一个问题是我用 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') |
4
Arnie97 2018-04-28 10:26:35 +08:00 via Android
#2 不是能看到正确的字符,只是能够覆盖对应的码点罢了。如果你拿一个覆盖了全部 256 种情况的单字节编码的解码器,显然可以解码世界上一切的字节流而不报错,只不过结果都是乱码
|