python3 输出中文报错,代码应该没问题,感觉是 cmd 编码的问题,但是百度了好久还是无法解决 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
rikka

python3 输出中文报错,代码应该没问题,感觉是 cmd 编码的问题,但是百度了好久还是无法解决

  •  
  •   rikka Mar 17, 2014 25933 views
    This topic created in 4423 days ago, the information mentioned may be changed or developed.
    # -- coding: utf-8 --
    a='大小写'
    print(a)
    =========
    使用idel能正常输出
    但是运行python -u d:\a.py 就报这个错误
    ======================
    Traceback (most recent call last):
    File "D:\a.py", line 5, in <module>
    print(a)
    File "C:\Python30\lib\io.py", line 1491, in write
    b = encoder.encode(s)
    File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
    57 replies    1970-01-01 08:00:00 +08:00
    tommark
        1
    tommark  
       Mar 17, 2014
    coding后面的编码(utf-8)要和你的py文件编码一致,你的a.py文本编码是utf-8的吗?
    rikka
        2
    rikka  
    OP
       Mar 17, 2014
    @tommark 确认是utf-8
    run2
        3
    run2  
       Mar 17, 2014
    BOM? 记事本默认的是utf-8 with bom
    VYSE
        4
    VYSE  
       Mar 17, 2014
    sys.stdout.encoding是cp1252吧,print会将unicode a转成cp1252,结果就是转不了
    PYTHOnIOENCODING="utf-8" python ...
    or
    sys.setdefaultencoding('UTF-8')
    rikka
        5
    rikka  
    OP
       Mar 17, 2014
    @sobigfish 确认没有BOM
    rikka
        6
    rikka  
    OP
       Mar 17, 2014
    @VYSE
    python3的sys模块已经移除了setdefaultencoding
    sys.stdout.encoding是cp1252
    =====
    # -- coding: utf-8 --
    import sys
    PYTHOnIOENCODING="utf-8"
    print(sys.stdout.encoding)
    a='大小写'
    print(a)
    =====
    也是报同样的错
    josephshen
        7
    josephshen  
       Mar 17, 2014
    更改注册表,Console下的CodePage设置为65001,FaceName设为“新宋体”
    rikka
        8
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    改完之后变成进入python交互模式无论输入任何语句或者错误不存在的函数都没报错也没显示什么东西
    改成963
    输入print('大小写')
    显示???
    est
        9
    est  
       Mar 17, 2014
    @rikka

    来,在有问题的python文件里贴个这行语句,把输出贴出来。

    print repr(open(__file__).read())
    Shared
        10
    Shared  
       Mar 17, 2014
    输入 chcp 看下活动代码页是不是 936,如果不是输入 chcp 936,之后应该就可以直接输出中文了
    josephshen
        11
    josephshen  
       Mar 17, 2014
    console下执行chcp,告诉我结果,在线等
    pianai
        12
    pianai  
       Mar 17, 2014
    推荐ubuntu下学习
    rikka
        13
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    注册表改成936执行chcp结果是437
    注册表改成65001执行chcp结果是65001
    josephshen
        14
    josephshen  
       Mar 17, 2014
    FaceName呢?
    rikka
        15
    rikka  
    OP
       Mar 17, 2014
    @est
    代码是这样的# -- coding: utf-8 --
    import sys
    import os
    print(repr(open(__file__).read()))
    a='大小写'
    print(a)
    # os.system("pause")
    ===========
    然后报错
    Traceback (most recent call last):
    File "D:\a.py", line 4, in <module>
    print(repr(open(__file__).read()))
    File "C:\Python30\lib\io.py", line 1724, in read
    decoder.decode(self.buffer.read(), final=True))
    File "C:\Python30\lib\io.py", line 1295, in decode
    output = self.decoder.decode(input, final=final)
    File "C:\Python30\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 90: character maps to <undefined>
    =====
    去掉
    a='大小写'
    print(a)
    正常
    '# -- coding: utf-8 --\nimport sys\nimport os\nprint(repr(open(__file__).read()))\n\n# os.system("pause") \n'
    rikka
        16
    rikka  
    OP
       Mar 17, 2014
    @josephshen FaceName是新宋体
    josephshen
        17
    josephshen  
       Mar 17, 2014
    python是python3.0??
    rikka
        18
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    Python 3.0 (r30:67507, Dec 3 2008, 19:44:23) [MSC v.1500 64 bit (AMD64)] on win32
    rikka
        19
    rikka  
    OP
       Mar 17, 2014
    不过奇怪我系统是win7 64位,python也是下载64位的,这里怎么显示on win32
    josephshen
        20
    josephshen  
       Mar 17, 2014
    用notepad++打开你的文件,告诉我你的文件编码。
    intosec
        21
    intosec  
       Mar 17, 2014
    是有这个问题,sqlmap在windows的cmd下也无法显示中文字符,改了cmd的字符集也没有用,当时想了个折衷的办法,就是用cygwin运行sqlmap。
    rikka
        22
    rikka  
    OP
       Mar 17, 2014
    右下角显示ansi as utf-8
    没错啊
    josephshen
        23
    josephshen  
       Mar 17, 2014
    来,用notpad++把编码转换成 utf-8,注意有BOM。
    rikka
        24
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    把编码调来调去,最后还是调成utf8,但是报错变成
    a='\u5927\u5c0f\u5199
    ^
    SyntaxError: EOL while scanning string literal
    josephshen
        25
    josephshen  
       Mar 17, 2014
    再跑一遍,告诉我你发现哪里有不同了
    josephshen
        26
    josephshen  
       Mar 17, 2014
    好,告诉我,你现在觉得哪里出问题了
    rikka
        27
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    哦,不是
    a='\u5927\u5c0f\u5199
    ^
    SyntaxError: EOL while scanning string literal
    这个报错是原因我写漏了一个引号
    然后无论是 utf-8有BOM还是无BOM
    报错信息跟一开始还是一样
    josephshen
        28
    josephshen  
       Mar 17, 2014
    position 90??这个数字,变了没有??
    rikka
        29
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    咦,这里有变化我没注意到
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
    josephshen
        30
    josephshen  
       Mar 17, 2014
    刚上了厕所,
    好,你现在告诉我,你觉得哪块出错了?
    rikka
        31
    rikka  
    OP
       Mar 17, 2014
    发现在开头加上
    print(repr(open(__file__).read()))
    这句position有变化
    现在代码是
    # -- coding: utf-8 --
    import sys
    import os
    print(repr(open(__file__).read()))
    a='大小写'
    print(a)
    # os.system("pause")
    报错是
    Traceback (most recent call last):
    File "D:\a.py", line 4, in <module>
    print(repr(open(__file__).read()))
    File "C:\Python30\lib\io.py", line 1724, in read
    decoder.decode(self.buffer.read(), final=True))
    File "C:\Python30\lib\io.py", line 1295, in decode
    output = self.decoder.decode(input, final=final)
    File "C:\Python30\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 93: character maps to <undefined>
    rikka
        32
    rikka  
    OP
       Mar 17, 2014
    还是看不出哪里错了T_T
    josephshen
        33
    josephshen  
       Mar 17, 2014
    好,你发现是print(repr(open(__file__).read()))有问题是吧?
    josephshen
        34
    josephshen  
       Mar 17, 2014
    这句里面有很多条代码,你一个个展开,每一句分开写,再跑一遍,告诉我哪错了
    xiaket
        35
    xiaket  
       Mar 17, 2014
    Windows下要玩python开个Linux虚拟机吧, 别折腾自己了.
    rikka
        36
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    代码是
    # -- coding: utf-8 --
    import sys
    import os
    q=open(__file__).read()
    w=repr(q)
    print(w)
    a='大小写'
    print(a)
    # os.system("pause")
    =======
    报错是
    Traceback (most recent call last):
    File "D:\a.py", line 4, in <module>
    q=open(__file__).read()
    File "C:\Python30\lib\io.py", line 1724, in read
    decoder.decode(self.buffer.read(), final=True))
    File "C:\Python30\lib\io.py", line 1295, in decode
    output = self.decoder.decode(input, final=final)
    File "C:\Python30\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
    UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 102: character maps to <undefined>
    ======
    好像是open(__file__).read()这里错了,因为文件中有中文所以出了问题
    josephshen
        37
    josephshen  
       Mar 17, 2014
    好,你现在找到了原因,解决办法另行Google。
    gamexg
        38
    gamexg  
       Mar 17, 2014
    # -- coding: utf-8 --
    import sys
    a='大小写'
    print(a)
    print(sys.stdout.encoding)
    print(sys.getdefaultencoding())
    print(sys.getfilesystemencoding())


    D:\>c:\Python33\python.exe t.py
    大小写
    cp936
    utf-8
    mbcs

    D:\>chcp
    活动代码页: 936

    D:\>c:\Python33\python.exe
    Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (In
    tel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>>

    我这里没有这个问题啊,奇怪的事情。

    还有open这样用应该不会报错了
    open(r"d:\111.txt",'w',encoding='utf8')
    rikka
        39
    rikka  
    OP
       Mar 17, 2014
    @josephshen 不是吧,TAT
    rikka
        40
    rikka  
    OP
       Mar 17, 2014
    @gamexg
    print(sys.stdout.encoding)
    print(sys.getdefaultencoding())
    print(sys.getfilesystemencoding())
    我的结果是
    cp1252
    utf-8
    mbcs
    gamexg
        41
    gamexg  
       Mar 17, 2014
    Cp1252 是标准的英语编码
    改编码吧,cmd的 需要 chcp 936 。
    gamexg
        42
    gamexg  
       Mar 17, 2014
    类似的错误:

    eclipse默认编码为Cp1252改成GBK的方法
    http://blog.csdn.net/hao123huo/article/details/6917612
    由一个小失误引起的Java编码格式问题大总结
    http://hi.baidu.com/g4studio/item/c2e58c14d4c26a0db88a1a71
    rikka
        43
    rikka  
    OP
       Mar 17, 2014
    @gamexg
    @josephshen
    我觉得原因应该是cmd的编码问题,而且我的电脑好像无法设置chcp 936啊
    cmd里面输入chcp 936,然后在输入chcp ,却显示437
    gamexg
        44
    gamexg  
       Mar 17, 2014
    重现错误,将 cmd 编码设置为1252就会出现和楼主一样的错误,改回936就可以正常输出中文:

    D:\>chcp 1252
    Active code page: 1252

    D:\>c:\Python33\python.exe t.py
    Traceback (most recent call last):
    File "t.py", line 4, in <module>
    print(a)
    File "c:\Python33\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: cha
    racter maps to <undefined>
    gamexg
        45
    gamexg  
       Mar 17, 2014   1
    是英文系统吗?
    英文环境输出中文 [chcp 936 无效页解决方案]
    http://blog.csdn.net/lcl_data/article/details/5269158
    rikka
        46
    rikka  
    OP
       Mar 17, 2014
    @gamexg
    我电脑不知道怎么回事,好像真的无法设置chcp 936,这样无效啊
    lu18887
        47
    lu18887  
       Mar 17, 2014
    cp1252.py 额,你的字符都跑到这个cp1252.py 文件里去转码了,说明你的cp是1252啊!
    gamexg
        48
    gamexg  
       Mar 17, 2014
    检查控制面板的区域和语言了吗?
    格式是中文,管理里面的系统区域设置也得是中文。把修改的系统设置全部改回去。

    如果系统实在是不能弄到cp936,下面的连接也许有用,但是并不是个好主意。
    http://apoo.bokee.com/7028948.html
    josephshen
        49
    josephshen  
       Mar 17, 2014
    诶,你们这些人啊,我拉了个屎回来,就全都走样了。

    你的open函数没有设定encoding,就这样。
    rikka
        50
    rikka  
    OP
       Mar 17, 2014
    @gamexg 我晚上再回去研究
    rikka
        51
    rikka  
    OP
       Mar 17, 2014
    @josephshen
    q=open(__file__,'r',encoding='utf8').read()
    也是报错的
    这跟open好像没什么关系吧,我本来代码就不需要去用这个函数
    nulloo
        52
    nulloo  
       Mar 17, 2014
    我也遇到过 python3输出会检查编码 然后中文系统编码没搞定
    最后放弃了,后来用colinux+ssh客户端运行了。。。

    另外说一句。。。请大家分清python2和python3 两个版本不通用qaq
    找py3资料结果搜到一堆py2的各种苦恼
    Muninn
        53
    Muninn  
       Mar 17, 2014
    1. 珍爱生命远离百度
    2. 玩python最好还是不要用windows 问题多多.可以用终端登服务器或者用linux虚拟机或者直接用mac或者linux.
    3. 非要在windows上用,要知道终端是兼容GBK的 ,输出到终端的字符串encode成GBK就好了.
    josephshen
        54
    josephshen  
       Mar 17, 2014
    TMD,你贴了两种代码,你自己知不知道么?
    一个执行了读文件,那个文件里面有中文,而且被编码成了utf8,所以你在open的时候需要指定编码格式。
    另外一个,只是print了个中文,那个中文能不能正常显示,要看你的cmd编码。
    还不明白??
    josephshen
        55
    josephshen  
       Mar 17, 2014
    还有,你堂堂一个写代码的居然TMD用百度?!
    我除了“呵呵”送给你,能找到答案就看你造化了。
    zjxubinbin
        56
    zjxubinbin  
       Mar 18, 2014
    @rikka Windows的话,去下载一个PowerShell就行了,比Linux下面的某些Shell更强大,而且默认就是UTF-8编码的
    qqblog
        57
    qqblog  
       Apr 26, 2014
    垃圾系统,格了吧
    About     Help     Advertise     Blog     API     FAQ     Solana     6044 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 90ms UTC 02:03 PVG 10:03 LAX 19:03 JFK 22:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86