坚持使用 UTF-8 作为默认编码
Persist UTF-8 as Default Encoding
我尝试将 UTF-8 保留为 Python 中的默认编码。
我试过了:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
我也试过:
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('UTF8')
>>> sys.getdefaultencoding()
'UTF8'
>>>
但关闭会话并打开新会话后,结果如下:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
如何保存我的更改?(我知道更改为 UTF-8 并不总是一个好主意。它位于 Docker 容器中 Python).
我知道这是可能的。我看到有人将 UTF-8 作为他的默认编码(总是)。
您可以随时在 python 文件的顶部添加:
# -*- coding: utf-8 -*-
这将在 *nix 系统中将该文件的编码更改为 utf-8。
首先,这几乎肯定是个坏主意,因为如果您 运行 在未完成此配置的另一台机器上代码会莫名其妙地中断。
(1) 像这样创建一个新文件(我的文件名为 setEncoding.py
):
import sys
# reload because Python removes setdefaultencoding() from the namespace
# see
reload(sys)
sys.setdefaultencoding("utf-8")
(2) 设置环境变量[PYTHONSTARTUP][1]
指向这个文件。
(3)当Python解释器加载时,PYTHONSTARTUP
指向的文件中的代码会先执行:
bgporter@Ornette ~/temp:python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> sys.getdefaultencoding()
'utf-8'
>>>
请查看 site.py 图书馆 - 这是 sys.setdefaultencoding
发生的地方。我认为,您可以修改或替换此模块,以使其永久存在于您的机器上。这是它的一些源代码,评论解释了一些事情:
def setencoding():
"""Set the string encoding used by the Unicode implementation. The
default is 'ascii', but if you're willing to experiment, you can
change this."""
encoding = "ascii" # Default value set by _PyUnicode_Init()
if 0:
# Enable to support locale aware default string encodings.
import locale
loc = locale.getdefaultlocale()
if loc[1]:
encoding = loc[1]
if 0:
# Enable to switch off string to Unicode coercion and implicit
# Unicode to string conversion.
encoding = "undefined"
if encoding != "ascii":
# On Non-Unicode builds this will raise an AttributeError...
sys.setdefaultencoding(encoding) # Needs Python Unicode build !
完整来源https://hg.python.org/cpython/file/2.7/Lib/site.py。
这是他们删除 sys.setdefaultencoding
函数的地方,如果您想知道的话:
def main():
...
# Remove sys.setdefaultencoding() so that users cannot change the
# encoding after initialization. The test for presence is needed when
# this module is run as a script, because this code is executed twice.
if hasattr(sys, "setdefaultencoding"):
del sys.setdefaultencoding
我尝试将 UTF-8 保留为 Python 中的默认编码。
我试过了:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
我也试过:
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('UTF8')
>>> sys.getdefaultencoding()
'UTF8'
>>>
但关闭会话并打开新会话后,结果如下:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
如何保存我的更改?(我知道更改为 UTF-8 并不总是一个好主意。它位于 Docker 容器中 Python).
我知道这是可能的。我看到有人将 UTF-8 作为他的默认编码(总是)。
您可以随时在 python 文件的顶部添加:
# -*- coding: utf-8 -*-
这将在 *nix 系统中将该文件的编码更改为 utf-8。
首先,这几乎肯定是个坏主意,因为如果您 运行 在未完成此配置的另一台机器上代码会莫名其妙地中断。
(1) 像这样创建一个新文件(我的文件名为 setEncoding.py
):
import sys
# reload because Python removes setdefaultencoding() from the namespace
# see
reload(sys)
sys.setdefaultencoding("utf-8")
(2) 设置环境变量[PYTHONSTARTUP][1]
指向这个文件。
(3)当Python解释器加载时,PYTHONSTARTUP
指向的文件中的代码会先执行:
bgporter@Ornette ~/temp:python
Python 2.7.10 (default, Oct 23 2015, 19:19:21)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> sys.getdefaultencoding()
'utf-8'
>>>
请查看 site.py 图书馆 - 这是 sys.setdefaultencoding
发生的地方。我认为,您可以修改或替换此模块,以使其永久存在于您的机器上。这是它的一些源代码,评论解释了一些事情:
def setencoding():
"""Set the string encoding used by the Unicode implementation. The
default is 'ascii', but if you're willing to experiment, you can
change this."""
encoding = "ascii" # Default value set by _PyUnicode_Init()
if 0:
# Enable to support locale aware default string encodings.
import locale
loc = locale.getdefaultlocale()
if loc[1]:
encoding = loc[1]
if 0:
# Enable to switch off string to Unicode coercion and implicit
# Unicode to string conversion.
encoding = "undefined"
if encoding != "ascii":
# On Non-Unicode builds this will raise an AttributeError...
sys.setdefaultencoding(encoding) # Needs Python Unicode build !
完整来源https://hg.python.org/cpython/file/2.7/Lib/site.py。
这是他们删除 sys.setdefaultencoding
函数的地方,如果您想知道的话:
def main():
...
# Remove sys.setdefaultencoding() so that users cannot change the
# encoding after initialization. The test for presence is needed when
# this module is run as a script, because this code is executed twice.
if hasattr(sys, "setdefaultencoding"):
del sys.setdefaultencoding