1
Daniel65536 2017-02-10 13:15:59 +08:00 via iPhone
chardet
|
2
beric OP @Daniel65536 不好意思忘记说了,用 chardet 检测不是很靠谱,比如当遇到“無印良品”这几个字时就是以下结果,还有一些中文的会检测成 KOI8-R ,啥的。{'confidence': 0.31101204298947943, 'encoding': 'ISO-8859-2'}
|
3
justou 2017-02-11 10:21:05 +08:00 1
@beric chardet 基于统计检测编码, 样本数不够(比如只有几个字)的时候要么检测不出来, 返回 None, 要么 confidence 很低, 除了基于统计, 目前没有任何有效的算法计算编码
|
4
beric OP @justou 谢谢!还想请教一下,比如某一个网站的文件下载,文件名的编码都是同一种的还是多种的?比如我测试的目标网站,纯中文的时候用 GB2312 可以解,比如“ MUJI 無印良品”这种文件名的时候又解不了,尝试用 UTF8 解也是乱码, 用这个 chardet 检测出 confidence 很低的某种不认识的编码。如果在 WIN 下跑的话,不处理文件名都能正常显示,那这文件名是啥编码能确定吗?
|
5
justou 2017-02-13 08:00:36 +08:00
如果你是从网页内容中提取文件名的, 试试用 chardet 检测整个网页的编码然后使用检测出的编码解码 filename="xxxxx", 一般来讲, 比较规范的网站编码都是统一的, 看看你的浏览器正确显示时用的什么编码就知道了
|
6
beric OP @justou 非常感谢,按你这个思路问题似乎解决了。网页的是 GBK 的。我用 GBK 解都 OK 了,之前一开始就用 chardet 检测,结果有 GB2312 和其它各种编码,一直这个思路带歪了,没想到跟网页编码一致。(因为不是从网页内容提取文件名的,文件名是下载连接里的 HEADER 提取的)
|
7
justou 2017-02-13 11:02:21 +08:00 1
网页其实也是通过 http 头跟统计来确定编码的, 设计规范的网页都会在 header 里面标注页面编码, 这个信息可以被浏览器利用, 如果编码乱标, 浏览器拿着可能也是乱码, 你可以试试把本页面保存下来, 然后将 html 头的 charset 声明改成 charset=ascii, 然后打开看看会不会乱码; 如果编码缺失, 浏览器会通过某些统计算法来确定编码(像 chardet 一样), 可以将本页面的 charset=utf-8 声明删掉, 再打开看看
|