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

Windows 中文 GBK 编码,这 TM 烦死我了!

  •  
  •   master13 · 2015-11-09 15:35:55 +08:00 · 6528 次点击
    这是一个创建于 3331 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,我就是前两天被炒鱿鱼的那个傻吊

    你们知道想在一个社区混个脸熟有多麻烦吗?

    中文简体 Windows 系统竟然是 GBK 编码的

    就说#coding=utf8,去读中文路径,你就比如os.walk(r'd:\python\暴走大事件')硬编码在代码里根本读不到任何东西,就因为代码里“暴走大事件”用 utf8 来看待,系统路径用 gbk 存的。想解决这个问题:

    • coding=gbk→失去了成为世界级程序员抱负
    • 从 windows 命令行读入包含中文的参数→失去了懒散的程序员硬编码时的快乐

    难道就没有别的办法吗?

    34 条回复    2015-11-14 00:51:28 +08:00
    yxaaa123
        1
    yxaaa123  
       2015-11-09 15:38:39 +08:00
    你用 vs 写,你用 c#啊,不然你换系统啊,扯没用的
    paulagent
        2
    paulagent  
       2015-11-09 15:39:04 +08:00 via Android
    ???
    yangtukun1412
        3
    yangtukun1412  
       2015-11-09 15:40:43 +08:00
    用 unicode
    lilydjwg
        4
    lilydjwg  
       2015-11-09 15:44:14 +08:00
    用 Python 3 就好了嘛。
    lilydjwg
        5
    lilydjwg  
       2015-11-09 15:45:22 +08:00
    PS: NT 内部使用的是 UTF-16LE 。就是那堆 W 结尾的 API 。 A 结尾的 API 跟 Python 2 一样,属于历史遗留问题。
    wy315700
        6
    wy315700  
       2015-11-09 15:47:43 +08:00   ❤️ 1
    程序没写好,怪系统喽
    firemiles
        7
    firemiles  
       2015-11-09 15:48:27 +08:00
    把 r 改成 u 不就行了
    imn1
        8
    imn1  
       2015-11-09 15:52:46 +08:00
    windows 运行 utf-8 的 py 程序前,先运行"chcp 65001"命令
    Narcissu5
        9
    Narcissu5  
       2015-11-09 15:54:14 +08:00
    cmd 有项参数可以改变字符集。不过有时候 cmd 是被别的程序打开的,比如 ide ,就比较难办了。
    9hills
        10
    9hills  
       2015-11-09 15:55:22 +08:00
    os.walk(r'd:\python\暴走大事件')

    你知道字符串前面加『 r 』是什么意思么。。。
    zjqzxc
        11
    zjqzxc  
       2015-11-09 15:56:12 +08:00
    咱能用 python3 么
    master13
        12
    master13  
    OP
       2015-11-09 16:03:45 +08:00
    @9hills 不知道……难道是“日”的意思?
    lsmgeb89
        13
    lsmgeb89  
       2015-11-09 16:18:06 +08:00
    看到楼主第一句话震惊了!
    9hills
        14
    9hills  
       2015-11-09 16:25:19 +08:00
    @master13 不知道你为啥要加 r 。。。

    写程序的最大忌讳就是不知道你在写什么,搜一下 Python String Unicode 这几个关键词吧
    gssdromen
        15
    gssdromen  
       2015-11-09 16:26:03 +08:00
    虽然用 GBK 这点的确值得吐槽,但这真的是很好解决的问题...
    lilydjwg
        16
    lilydjwg  
       2015-11-09 16:30:55 +08:00
    @9hills 你知道字符串前面加「 r 」是什么意思么?

    回答别人的问题的最忌讳你根本不知道你在说什么,搜一下 Python raw string 吧。
    lilydjwg
        17
    lilydjwg  
       2015-11-09 16:31:53 +08:00
    @firemiles 那样,如果路径里有个 test 目录就不好了。 Python 2 可以 ur'...' 的。不过不一定有用, Python 2 的标准库关于 unicode 的支持是混乱的。
    PythonAnswer
        18
    PythonAnswer  
       2015-11-09 16:34:49 +08:00
    py3 无问题.
    leavic
        19
    leavic  
       2015-11-09 16:42:44 +08:00
    #coding:utf8
    import os

    chs_path=u'中文'
    dir=os.path.join(os.curdir,chs_path)
    for item in os.walk(dir):
    print item
    ======================
    我这还是 python 2.7 ,楼主你离世界级程序员可能差了两个平行宇宙。
    fengyqf
        20
    fengyqf  
       2015-11-09 16:47:57 +08:00
    咱能不能不用中文做文件名?
    或者知道所使用工具的特性和缺陷
    9hills
        21
    9hills  
       2015-11-09 16:51:19 +08:00
    @lilydjwg 呵呵,好像谁不知道是的

    我指点 lz 去搜索 unicode string 就是让他去走正确的路,搜 raw string 你是想让他进坑么?
    lilydjwg
        22
    lilydjwg  
       2015-11-09 16:54:54 +08:00
    @9hills 你不让他用 raw string 写 Windows 路径不是让他掉进另一个坑么?还是你根本不知道 raw string 是干嘛的?我那是让你搜,没让他搜。
    9hills
        23
    9hills  
       2015-11-09 16:55:36 +08:00
    @lilydjwg

    乖乖用 unicode ,用 os.path.join()去拼路径,嘛事都没有。 ur'string'也是教的一手好 python
    9hills
        24
    9hills  
       2015-11-09 16:56:12 +08:00
    @lilydjwg 呵呵,你不会用 os.path.join()去拼接路径么,直接去写 windows 路径那才是巨坑
    9hills
        25
    9hills  
       2015-11-09 16:58:04 +08:00
    明明 Python 给了不能算是非常好但是还不错的跨平台解决办法,就要用一些平台独占的 tips 。。还沾沾自喜,这种写法迟早掉大坑。
    xiaosha009
        26
    xiaosha009  
       2015-11-09 18:46:47 +08:00
    系统说:“怪我咯~”
    zkd8907
        27
    zkd8907  
       2015-11-09 18:55:05 +08:00
    Windows :这锅我不背
    flynaj
        28
    flynaj  
       2015-11-09 21:29:16 +08:00 via Android
    还得注意 windows 10 有所变化,
    fangdingjun
        29
    fangdingjun  
       2015-11-09 21:50:30 +08:00   ❤️ 1
    windows 下文件名写成这样的也可以 d:/path/file/aaa.txt,
    用中文要用 unicode, u 前缀,这样
    os.walk(u'd:/python/暴走大事件')

    os.walk 调用的是 os.listdir ,
    os.listdir 传 unicode, 返回的也是 unicode, 传 gbk ,返回的也是 gbk

    我也是踩了好多坑才明白的
    shenghe
        30
    shenghe  
       2015-11-10 08:44:48 +08:00
    python 的编码支持确实是大坑。 python 的编码和包管理机制,都是设计之初就有问题的玩意
    urmyfaith
        31
    urmyfaith  
       2015-11-10 09:44:11 +08:00
    咱能不能不用中文做文件名?

    +10086
    esile
        32
    esile  
       2015-11-10 09:57:07 +08:00 via iPhone
    py2 妥妥的可以玩
    fy
        33
    fy  
       2015-11-10 22:28:39 +08:00
    编码的坑主要还是建议直接 py3 走起
    dofine
        34
    dofine  
       2015-11-14 00:51:28 +08:00
    公司内部还在用 Python 2.6 的飘过~
    中文的坑全部都用 #coding=gbk 了。。
    慢慢竟然也看习惯了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4122 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:22 · PVG 13:22 · LAX 21:22 · JFK 00:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.