在python3中正确使用unicode字符-强制utf-8编码

con*_*tti 1 python unicode encoding utf-8 python-3.x

我要疯了。互联网和这个 SO question告诉我,在 python 3.x 中,默认编码是 UTF-8。除此之外,我系统的默认编码是 UTF-8。除此之外,我# -*- coding: utf-8 -*-在我的 python 3.5 文件的顶部。

尽管如此,python 仍在使用 ascii:

# -*- coding: utf-8 -*-
mystring = "?"
print(mystring)
Run Code Online (Sandbox Code Playgroud)

跟我打招呼:

SyntaxError: 'ascii' codec can't decode byte 0xe2 in position 7: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我也试过这个:print(mystring.encode("utf-8")).decode("utf-8")- 同样的事情。

我在这里缺少什么?如何强制 python 停止使用 ascii 编码?


编辑:我知道position 7用一个字符串来抱怨似乎很奇怪,但这是我的实际 MCVE 和我得到的确切输出。上面是使用python shell,下面是脚本。两者都使用python 3.5.2.


编辑:因为我认为它可能是相关的:我得到的字符串来自外部应用程序并且不是硬编码的,所以我需要一种方法来获取该 utf-8 字符串并将其保存到文件中。以上只是一个最小化和通用化的例子。这是我的真实代码:

# the variables being a string that might contain unicode characters
mystring = "username: " + fromuser + " | printname: " + fromname
with open("myfile.txt", "a") as myfile:
  myfile.write(mystring + "\n")
Run Code Online (Sandbox Code Playgroud)

seh*_*foc 5

在 Python3 中,所有字符串都是 unicode,因此您遇到的问题可能是由于您的语言环境设置不正确。Python3 解释器会使用 locale 环境变量,如果找不到它们,它会模拟基本的 ASCII

来自 locale.py:

except ImportError:

    # Locale emulation

    CHAR_MAX = 127
    LC_ALL = 6
    LC_COLLATE = 3
    LC_CTYPE = 0
    LC_MESSAGES = 5
    LC_MONETARY = 4
    LC_NUMERIC = 1
    LC_TIME = 2
    Error = ValueError
Run Code Online (Sandbox Code Playgroud)

仔细检查您正在执行的 shell 上的语言环境。这里有一些变通方法,您可以在完成正确设置 env 的任务之前尝试查看它们是否能让您工作。

1) 验证是否安装了 UTF-8 区域设置或语言文件(请参阅上面的链接)

2)尝试将其添加到脚本的顶部

#!/usr/bin/env LC_ALL=en_US.UTF-8 /usr/local/bin/python3
print('????')
Run Code Online (Sandbox Code Playgroud)

或者

#!/usr/bin/env LANG=en_US.UTF-8 /usr/local/bin/python3
print('????')
Run Code Online (Sandbox Code Playgroud)

或者在执行 Python 解释器之前导出 shell 变量

export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
python3
>>> print('????')
Run Code Online (Sandbox Code Playgroud)

抱歉,我不能更具体,因为这些设置是特定于平台和操作系统的。您可以直接使用 locale 模块强制尝试在 Python 中设置语言环境,但我不建议这样做,如果未安装它们也无济于事。

希望有帮助。