mlz*_*boy 158 python encoding utf-8 python-2.x sys
我见过很少的py脚本在脚本的顶部使用它.在什么情况下应该使用它?
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
Run Code Online (Sandbox Code Playgroud)
pyf*_*unc 137
根据文档:这允许您从默认ASCII切换到其他编码,例如UTF-8,只要必须将字符串缓冲区解码为unicode,Python运行时就会使用这些编码.
此功能仅在Python启动时可用,当Python扫描环境时.必须在系统范围的模块中调用它sitecustomize.py,在评估此模块后,setdefaultencoding()将从sys模块中删除该功能.
实际使用它的唯一方法是使用重新加载hack来恢复属性.
此外,一直不鼓励使用sys.setdefaultencoding()它,它已成为py3k中的无操作.py3k的编码硬连接到"utf-8"并且更改它会引发错误.
我建议阅读一些指示:
Ala*_*ack 56
答案永远不会!(除非你真的知道你在做什么)
通过正确理解编码/解码,可以解决9/10倍的解决方案.
1/10人的语言环境或环境定义不正确,需要设置:
PYTHONIOENCODING="UTF-8"
Run Code Online (Sandbox Code Playgroud)
在他们的环境中修复控制台打印问题.
(通过以避免重复使用)更改默认编码/解码,只要Python 2.x需要将Unicode()转换为str()(反之亦然)并且未给出编码.即:sys.setdefaultencoding("utf-8")
str(u"\u20AC")
unicode("€")
"{}".format(u"\u20AC")
Run Code Online (Sandbox Code Playgroud)
在Python 2.x中,默认编码设置为ASCII,上面的示例将失败:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
(我的控制台配置为UTF-8 "€" = '\xe2\x82\xac',因此异常\xe2)
要么
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
将允许这些对我有用,但不一定适用于不使用UTF-8的人.ASCII的默认值确保编码的假设不会被烘焙到代码中sys.setdefaultencoding("utf-8")
还具有出现修复的副作用,在将sys.setdefaultencoding("utf-8")sys.stdout.encoding字符打印到控制台时使用.Python使用用户的语言环境(Linux/OS X/Un*x)或代码页(Windows)来设置它.有时,用户的语言环境已损坏,只需要PYTHONIOENCODING修复控制台编码.
例:
$ export LANG=en_GB.gibberish
$ python
>>> import sys
>>> sys.stdout.encoding
'ANSI_X3.4-1968'
>>> print u"\u20AC"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 0: ordinal not in range(128)
>>> exit()
$ PYTHONIOENCODING=UTF-8 python
>>> import sys
>>> sys.stdout.encoding
'UTF-8'
>>> print u"\u20AC"
€
Run Code Online (Sandbox Code Playgroud)
由于默认编码是ASCII,人们已经开发了针对Python 2.x的16年.UnicodeError已经编写了异常处理方法来处理发现包含非ASCII的字符串的字符串到Unicode转换.
来自https://anonbadger.wordpress.com/2015/06/16/why-sys-setdefaultencoding-will-break-code/
def welcome_message(byte_string):
try:
return u"%s runs your business" % byte_string
except UnicodeError:
return u"%s runs your business" % unicode(byte_string,
encoding=detect_encoding(byte_string))
print(welcome_message(u"Angstrom (Å®)".encode("latin-1"))
Run Code Online (Sandbox Code Playgroud)
在设置defaultencoding之前,此代码将无法解码ascii编码中的"Å",然后将进入异常处理程序以猜测编码并将其正确地转换为unicode.印刷:Angstrom(Å®)经营您的业务.一旦你将defaultencoding设置为utf-8,代码就会发现byte_string可以被解释为utf-8,因此它会破坏数据并返回它:Angstrom(Ů)运行你的业务.
改变应该是常数将对你所依赖的模块产生巨大影响.最好只修复进出代码的数据.
虽然在下面的示例中将defaultencoding设置为UTF-8不是根本原因,但它显示了如何屏蔽问题以及当输入编码更改时,代码如何以不明显的方式中断: UnicodeDecodeError:'utf8'编解码器可以在位置3131解码字节0x80:无效的起始字节
Sér*_*gio 18
#!/usr/bin/env python
#-*- coding: utf-8 -*-
u = u'moçambique'
print u.encode("utf-8")
print u
chmod +x test.py
./test.py
moçambique
moçambique
./test.py > output.txt
Traceback (most recent call last):
File "./test.py", line 5, in <module>
print u
UnicodeEncodeError: 'ascii' codec can't encode character
u'\xe7' in position 2: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
在shell工作,发送到sdtout不,所以这是一个解决方法,写入stdout.
我做了其他方法,如果没有定义sys.stdout.encoding,则不运行,或者换句话说,首先需要导出PYTHONIOENCODING = UTF-8来写入stdout.
import sys
if (sys.stdout.encoding is None):
print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout."
exit(1)
Run Code Online (Sandbox Code Playgroud)
所以,使用相同的例子:
export PYTHONIOENCODING=UTF-8
./test.py > output.txt
Run Code Online (Sandbox Code Playgroud)
将工作
| 归档时间: |
|
| 查看次数: |
178736 次 |
| 最近记录: |