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)
在 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 中设置语言环境,但我不建议这样做,如果未安装它们也无济于事。
希望有帮助。
| 归档时间: |
|
| 查看次数: |
4094 次 |
| 最近记录: |