dis*_*cer 8 python unicode macos terminal
有人可以向我解释这个奇怪的事情:
在python shell中我输入以下西里尔字符串:
>>> print '?????'
?????
Run Code Online (Sandbox Code Playgroud)
但是当我键入:
>>> print u'?????'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
由于第一个tring正确出来,我估计我的OS X终端可以代表unicode,但事实证明它不能在第二种情况下.为什么?
sth*_*sth 17
>>> print '?????'
?????
Run Code Online (Sandbox Code Playgroud)
当您键入某些字符时,终端会决定如何将这些字符表示给应用程序.您的终端可能会将字符提供给编码为utf-8,ISO-8859-5的应用程序,甚至是您的终端只能理解的内容.Python将这些字符作为一些字节序列.然后python按原样输出这些字节,并且终端以某种方式解释它们以显示字符.由于您的终端通常以与之前编码的方式相同的方式解释字节,因此所有内容都会像您输入的那样显示.
>>> u'?????'
Run Code Online (Sandbox Code Playgroud)
在这里,您输入一些到达python解释器的字符作为字节序列,可能由终端以某种方式编码.使用u
前缀python尝试将此数据转换为unicode.要正确执行此操作,python必须知道终端使用的编码.在您的情况下,看起来Python猜测您的终端编码将是ASCII,但接收的数据与此不匹配,因此您得到编码错误.
因此,在交互式会话中创建unicode字符串的直接方式是这样的:
>>> us = '?????'.decode('my-terminal-encoding')
Run Code Online (Sandbox Code Playgroud)
在文件中,您还可以使用特殊模式行指定文件的编码:
# -*- encoding: ISO-8859-5 -*-
us = u'?????'
Run Code Online (Sandbox Code Playgroud)
有关设置默认输入编码的其他方法,您可以查看sys.setdefaultencoding(...)
或sys.stdin.encoding
.
Ing*_*upp 14
从Python 2.6开始,您可以使用环境变量PYTHONIOENCODING
告诉Python您的终端是否支持UTF-8.最简单的方法是将以下行添加到您的~/.bash_profile
:
export PYTHONIOENCODING=utf-8
Run Code Online (Sandbox Code Playgroud)
除了确保您的OS X终端设置为UTF-8之外,您可能希望将python sys默认编码设置为UTF-8或更高版本.在/Library/Python/2.5/site-packages
被叫中创建一个文件sitecustomize.py
.在这个文件中:
import sys
sys.setdefaultencoding('utf-8')
Run Code Online (Sandbox Code Playgroud)
该setdefaultencoding
方法仅由站点模块提供,并在启动完成后从sys命名空间中删除.因此,您需要启动一个新的python解释器才能使更改生效.您可以在启动后随时验证当前的默认编码sys.getdefaultencoding()
.
如果字符不是unicode并且您需要转换它们,请decode
对字符串使用该方法,以便将来自其他字符集的文本解码为unicode ...最好指定哪个字符集:
s = '?????'.decode('some_cyrillic_charset') # makes the string unicode
print s.encode('utf-8') # transform the unicode into utf-8, then print it
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17386 次 |
最近记录: |