V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
beric
V2EX  ›  Python

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

  •  
  •   beric · 2017-02-10 12:25:09 +08:00 · 3732 次点击
    这是一个创建于 2841 天前的主题,其中的信息可能已经有所发展或是发生改变。
    (部署在 centos 上默认编码是 utf-8 )通过 python 下载文件时,取得的 HTTP 头是以下:
    Content-Encoding: none
    Content-Disposition: attachment; filename="xxxxx"

    提取 filename=后的 xxxxx 这个可能是英文,简体,繁体之类的,如果直接用这个文件名保存的话可能会出现乱码。
    有没有一个靠谱的方法检测文件名编码,然后将它统一转换成 utf8?
    8 条回复    2017-02-14 09:45:10 +08:00
    Daniel65536
        1
    Daniel65536  
       2017-02-10 13:15:59 +08:00 via iPhone
    chardet
    beric
        2
    beric  
    OP
       2017-02-10 17:43:50 +08:00
    @Daniel65536 不好意思忘记说了,用 chardet 检测不是很靠谱,比如当遇到“無印良品”这几个字时就是以下结果,还有一些中文的会检测成 KOI8-R ,啥的。{'confidence': 0.31101204298947943, 'encoding': 'ISO-8859-2'}
    justou
        3
    justou  
       2017-02-11 10:21:05 +08:00   ❤️ 1
    @beric chardet 基于统计检测编码, 样本数不够(比如只有几个字)的时候要么检测不出来, 返回 None, 要么 confidence 很低, 除了基于统计, 目前没有任何有效的算法计算编码
    beric
        4
    beric  
    OP
       2017-02-12 23:04:08 +08:00
    @justou 谢谢!还想请教一下,比如某一个网站的文件下载,文件名的编码都是同一种的还是多种的?比如我测试的目标网站,纯中文的时候用 GB2312 可以解,比如“ MUJI 無印良品”这种文件名的时候又解不了,尝试用 UTF8 解也是乱码, 用这个 chardet 检测出 confidence 很低的某种不认识的编码。如果在 WIN 下跑的话,不处理文件名都能正常显示,那这文件名是啥编码能确定吗?
    justou
        5
    justou  
       2017-02-13 08:00:36 +08:00
    如果你是从网页内容中提取文件名的, 试试用 chardet 检测整个网页的编码然后使用检测出的编码解码 filename="xxxxx", 一般来讲, 比较规范的网站编码都是统一的, 看看你的浏览器正确显示时用的什么编码就知道了
    beric
        6
    beric  
    OP
       2017-02-13 10:17:39 +08:00
    @justou 非常感谢,按你这个思路问题似乎解决了。网页的是 GBK 的。我用 GBK 解都 OK 了,之前一开始就用 chardet 检测,结果有 GB2312 和其它各种编码,一直这个思路带歪了,没想到跟网页编码一致。(因为不是从网页内容提取文件名的,文件名是下载连接里的 HEADER 提取的)
    justou
        7
    justou  
       2017-02-13 11:02:21 +08:00   ❤️ 1
    网页其实也是通过 http 头跟统计来确定编码的, 设计规范的网页都会在 header 里面标注页面编码, 这个信息可以被浏览器利用, 如果编码乱标, 浏览器拿着可能也是乱码, 你可以试试把本页面保存下来, 然后将 html 头的 charset 声明改成 charset=ascii, 然后打开看看会不会乱码; 如果编码缺失, 浏览器会通过某些统计算法来确定编码(像 chardet 一样), 可以将本页面的 charset=utf-8 声明删掉, 再打开看看
    beric
        8
    beric  
    OP
       2017-02-14 09:45:10 +08:00
    @justou 谢谢!明白了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.