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
zungmou
V2EX  ›  Python

通过命令行传入一个文件路径,路径中包含中文和韩文, Python 如何处理?

  •  
  •   zungmou · 2016-10-06 21:42:10 +08:00 · 4605 次点击
    这是一个创建于 2998 天前的主题,其中的信息可能已经有所发展或是发生改变。
    譬如通过命令行传递一个参数:

    test.py C:\Users\user\Downloads\新建文件夹나인틴

    参数中有中文,也有韩文(或其它国家文字),环境为 Win10

    用 str.encode('gb2312') 是无法解码的,只能解出中文,韩文显示为 ???

    文件头已经添加了 # -*- coding: UTF-8 -*- 表明文件 Python 文件格式为 utf-8 编码。

    使用过 str.encode('utf-8') 更是无法解码直接报异常。

    --------------------------------

    补充下,用 chardet 检测出来是 utf-8,但这个结果明显没用。


    社区里的 Python 专家能否帮忙看下,这个问题如何解决?
    10 条回复    2016-10-13 00:19:01 +08:00
    veelog
        1
    veelog  
       2016-10-06 22:02:11 +08:00 via Android
    入参是什么编码就按什么 decode
    billlee
        2
    billlee  
       2016-10-06 22:06:02 +08:00
    gbk 试试?中文 windows 的 cmd 应该是默认用 gbk 编码
    zungmou
        3
    zungmou  
    OP
       2016-10-06 22:07:30 +08:00
    @veelog
    @billlee

    我的 win10 cmd 的默认编码是 gbk ,可是按照 gbk 解码只能解中文,韩文就显示 ???
    imn1
        4
    imn1  
       2016-10-06 22:15:17 +08:00
    程序能运行,只是输出错误而已,运行程序前先运行“ chcp 65001 ”则可
    py3 比 py2 最大优势就在此,能把 win 路径都转为 utf-8 ,其他语言可能还要使用 win 相关模块才能读
    schezukNewTos
        5
    schezukNewTos  
       2016-10-06 22:20:05 +08:00
    @imn1 chcp 不解决问题。
    zungmou
        6
    zungmou  
    OP
       2016-10-06 22:24:37 +08:00
    @imn1
    @schezukNewTos

    的确如此, chcp 65001 不解决问题。
    imn1
        7
    imn1  
       2016-10-06 22:32:40 +08:00

    win10 变了?我以前 win7 处理韩文路径多了去了,都没问题
    win10 我已经转 subsytem/bash ,不再用 win 版的 python 了

    或者一种可能是你的 cmd 字体不是 unicode 的,你要找个支持 unicode 的字体
    反正显示???而不是报错的话,就说明程序没问题
    billlee
        8
    billlee  
       2016-10-06 22:58:47 +08:00
    @zungmou GBK 里面似乎是包含谚文字符的

    仔细看了你的描述,你应该是把 encode/decode 用反了吧, windows 传进来的参数是 gbk 编码的二进制串,要 decode('gbk') 成 unicode 串,如果这一步没抛异常,应该就已经解码成功了
    veelog
        9
    veelog  
       2016-10-07 13:53:35 +08:00
    gbk 是无法编码韩文的呀。。
    Arthur2e5
        10
    Arthur2e5  
       2016-10-13 00:19:01 +08:00
    gbk 我记得是没有谚文字符的,全都得用 18030 的 UTF 去做( https://r12a.github.io/apps/encodings/)。要不要默认这一点然后用一下 'gb18030' 去 decode/encode ?(结果变成猜 conhost 怎么处理复制粘贴输入,还有解码 cp936 的时候会不会尝试 cp54936 了……)

    print b'\xd0\xc2\xbd\xa8\xce\xc4\xbc\xfe\xbc\xd0\x828\xc71\x833\x9a7\x835\xc47' # gb18030 出来的

    另外 Python 的 cp936 实现坑很大(没有欧元字符, Py#28343 ),不过在 Windows 上因为会直接调用系统 MultiByteToUnicode 还是建议一试。要兼容不同语言 Windows 的话可以试试 'mbcs' 这个特殊编码名,直接 MultiByteToUnicode 按照当前编码解析。

    慢着,怎么全都是 encode 不是 decode 来着……?一般 print 的话直接把 <type 'unicode'> 的浆糊丢出去让 Py 看着办吧。

    * * *

    @zungmou 开个 65001 当然该解决问题。如果你看到的不是问号字符而是有个框的问号,那就说明是字体问题不是 Python 解码问题了。造个 cmd 快捷方式去注册表折腾折腾换个字体试试吧。

    @imn1 py3 不是转 utf-8 ,是转了一个内部可能为 UTF-8/16/32 的 <type 'str'>(也就是 py2 'unicode')实现。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2635 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:10 · PVG 15:10 · LAX 23:10 · JFK 02:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.