文件名的多语言编码如何统一转换成 utf-8

2017-02-10 12:25:09 +08:00
 beric
(部署在 centos 上默认编码是 utf-8 )通过 python 下载文件时,取得的 HTTP 头是以下:
Content-Encoding: none
Content-Disposition: attachment; filename="xxxxx"

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

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

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

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

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

© 2021 V2EX