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

Python 2.7.10 print 中文了? 然后我凌乱了!!!!

  •  
  •   lhstock · 2017-11-29 00:51:43 +08:00 · 5060 次点击
    这是一个创建于 2552 天前的主题,其中的信息可能已经有所发展或是发生改变。

    初学者,coding 验证 “字符串与编码”时,发现无需加'u'可输出中文。

    我记得之前(几个月前)是不行的。搜了一下并未有提及 2.7 支持中文的说法;然后做了一些环境的测试后我凌乱了。

    • 有些可以输出
    • 有些部分乱码
    • 甚至有些会报错(“些”==1 )

    不会贴图还望见谅

    测试代码:

    # !/usr/bin/python
    #  -*- coding: utf-u -*-
    str = '吃'
    print str
    print (u'吃')
    print u'吃'
    

    输出

    ****环境 1:Mac****
    吃
    吃
    吃
    
    ****window10 - cmd ***
    鍚
    吃
    吃
    
    ***windows10 - Git_bash
    吃
    Traceback (most recent call last):
      File "2-stringCode.py", line 14, in <module>
        print (u'吃')
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u5403' in position 0: ordinal not in range(128)
    
    ****window10 - Visual Studio Code 调试器****
    吃
    吃
    吃
    

    我。。。。。凌乱了;

    枉各位大佬不吝指教

    18 条回复    2017-11-29 20:29:02 +08:00
    binux
        1
    binux  
       2017-11-29 00:55:33 +08:00
    老生常谈的问题了,还拿出来问,看着烦。你就不会自己去搜一下吗?
    likuku
        2
    likuku  
       2017-11-29 01:14:21 +08:00
    2.x 很快就要停止支持了,怎么还不觉悟?
    lhstock
        3
    lhstock  
    OP
       2017-11-29 01:21:06 +08:00
    @binux 我搜了啊。看了一部分是讲 print '吃' 但返回的是 unicode 编码 '\u5403'时应该 print u'吃‘来正确打印出“吃” ;真不知道怎么搜没有 u 直接出来 utf-8 编码;
    lhstock
        4
    lhstock  
    OP
       2017-11-29 01:23:24 +08:00
    @likuku emmm....那我直接 3.0 吧 。但是我真的很好奇这个问题
    yazi
        5
    yazi  
       2017-11-29 01:26:30 +08:00
    utf-u 是什么
    likuku
        6
    likuku  
       2017-11-29 01:33:07 +08:00
    win10 的 cmd 默认字符集还是 GBK,得 chcp 65001 才会变成 UTF-8

    py2.x 支持处理中文信息(变量 /函数 /类 不能用中文)也不是很难,至少保证下面即可:
    .py 头放上指定编码的魔法字串:
    # !/usr/bin/python
    # -*- coding: utf-8 -*-

    .py 使用 UTF-8 保存

    运行的系统环境 /终端 确保也用 UTF-8,读写的数据库 /文本文件,统统保证是 UTF-8 编码

    2.x 没多少日子活了,最好还是直接 3.x
    likuku
        7
    likuku  
       2017-11-29 01:36:21 +08:00
    https://www.v2ex.com/t/410349#reply6

    条件具备时,2.x 里直接 print('中文') 本就是没问题
    ysc3839
        8
    ysc3839  
       2017-11-29 01:47:33 +08:00 via Android   ❤️ 9
    你的源文件编码是 UTF-8,所以不加 u 的字符串是 UTF-8 编码的。
    Mac: 终端默认编码 UTF-8,所以第一个 print 没问题。
    cmd: 终端默认编码 CP936,所以第一个 print 乱码。
    Git bash: 终端默认编码是 UTF-8,所以第一个 print 没问题,但是 Python 检测错了,以为终端编码是 ASCII,所以转换时出错。
    VSCode: 情况同 Mac。
    lhstock
        9
    lhstock  
    OP
       2017-11-29 09:23:45 +08:00
    @yazi 源码里是"utf-8",这里手敲时打错了,抱歉。
    lhstock
        10
    lhstock  
    OP
       2017-11-29 09:27:54 +08:00
    @likuku @ysc3839 感谢两位。原来我忽略了终端的编码设置。
    IllllI
        11
    IllllI  
       2017-11-29 10:01:39 +08:00
    Marmot
        12
    Marmot  
       2017-11-29 10:53:56 +08:00
    恼火,早点换 3 把,utf-8 统一世界
    yepinf
        13
    yepinf  
       2017-11-29 14:50:31 +08:00
    试试这
    `from __future__ import unicode_literals`
    xubeiyan
        14
    xubeiyan  
       2017-11-29 16:56:36 +08:00
    还有人认为 py2 只要指定文件编码,加不加 u 对字符串没影响吗? @ysc3839 @likuku
    ```python
    # coding:utf-8
    str = '你好世界'
    u_str = u'你好世界'
    print str
    print u_str
    ```
    上面代码保存成 utf-8 在 cmd 下跑一下试试……
    likuku
        15
    likuku  
       2017-11-29 17:11:43 +08:00
    @xubeiyan “ win10 的 cmd 默认字符集还是 GBK,得 chcp 65001 才会变成 UTF-8 ”,这行没看到么?
    lhstock
        16
    lhstock  
    OP
       2017-11-29 17:34:42 +08:00
    @xubeiyan 抱歉,我把你的反问理解为:“你诶特的两位 认为 py2 只要指定文件编码就无所谓加 u 了";而我从两位的答案看出:“我所遇到的问题是因为执行终端默认编码不同导致的"。我觉得你理解有误。
    lhstock
        17
    lhstock  
    OP
       2017-11-29 17:35:46 +08:00
    @yepinf 好的。我晚上回家试试。因为家里的 PC 可以复现
    xubeiyan
        18
    xubeiyan  
       2017-11-29 20:29:02 +08:00   ❤️ 1
    @lhstock 本来他两人就理解错了,在 python2 里面本来 u'你好世界'和'你好世界'就是不一样的,后者是 str,前者是 unicode,你可以加上 type(str)和 type(u_str)验证一下,为什么你在 cmd 里看起来差不多呢?因为在输出的时候 print 执行了一次转码……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2579 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:38 · PVG 23:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.