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

2018-04-26 15:41:39 +08:00
 sjmcefc2

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

1502 次点击
所在节点    程序员
6 条回复
Arnie97
2018-04-27 02:00:07 +08:00
本来就是概率方法,如果文件很短就失效了。所有的 UTF-8 / GBK 字节流必然都能按照 1252 解码不爆异常
sjmcefc2
2018-04-27 09:21:50 +08:00
@Arnie97 一个字符“纠” 就被 chardet 判断成了 TIS-620.这样就失效了。
UTF-8/GBK 都能被 windows 1250 解码的含义是,正确显示字符吗(肉眼看到的是正确的字符)?是不是可以说针对汉字,可以默认 windows 1250 来解码?

一直觉得解码没有异常并不一定不是乱码?我这样理解对吗?
如何才能真正的某字符串不是乱码呢?
sjmcefc2
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
2018-04-28 10:26:35 +08:00
#2 不是能看到正确的字符,只是能够覆盖对应的码点罢了。如果你拿一个覆盖了全部 256 种情况的单字节编码的解码器,显然可以解码世界上一切的字节流而不报错,只不过结果都是乱码
sjmcefc2
2018-04-28 11:35:20 +08:00
@Arnie97 这就是最大的担忧,乱码是不是只能肉眼检查?
sjmcefc2
2018-04-28 11:54:05 +08:00
@Arnie97 如何应对实际上解码错误的问题呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/450099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX