为啥 Python 不能识别我的 utf-8 编码源文件?
Posted
技术标签:
【中文标题】为啥 Python 不能识别我的 utf-8 编码源文件?【英文标题】:Why doesn't Python recognize my utf-8 encoded source file?为什么 Python 不能识别我的 utf-8 编码源文件? 【发布时间】:2012-12-26 09:29:40 【问题描述】:这是一个带有非 ASCII 字符的小 tmp.py:
if __name__ == "__main__":
s = 'ß'
print(s)
运行它我得到以下错误:
Traceback (most recent call last):
File ".\tmp.py", line 3, in <module>
print(s)
File "C:\Python32\lib\encodings\cp866.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to <undefined>
Python 文档says:
默认情况下,Python 源文件被视为以 UTF-8 编码...
我检查编码的方法是使用 Firefox(也许有人会提出更明显的建议)。我在 Firefox 中打开 tmp.py ,如果我选择 View->Character Encoding->Unicode (UTF-8) 它看起来不错,这就是它在这个问题上面的样子(带有 ß 符号)。
如果我说:
# -*- encoding: utf-8 -*-
作为 tmp.py 中的第一个字符串,它不会改变任何内容——错误仍然存在。
谁能帮我弄清楚我做错了什么?
【问题讨论】:
@Blender:u
在 Python 3 中没有任何作用(在 Python 3 的早期版本中是一个错误,直到它被添加回来以实现向后兼容性)
您在编辑器中设置编码的可能性更大。
还说编码错误..不是解码错误。由于 cp866 是 ms-dos 代码页,我认为您正在尝试将其打印到控制台,这需要编码。
@Wooble 你能向我解释一下如何确定吗?如果我使用 Firefox 技巧并选择 ISO 8859-1,我会看到 s = 'ß'
而不是 s = 'ß'。
@mezhaka:我错了,Martijn 的解释是正确的。
【参考方案1】:
terminal is using 的编码不支持该字符:
>>> '\xdf'.encode('cp866')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/encodings/cp866.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character '\xdf' in position 0: character maps to <undefined>
Python 处理得很好,是你的输出编码不能处理它。
您可以尝试在 Windows 控制台中使用chcp 65001
来切换您的代码页; chcp
是用于更改代码页的 Windows 命令行命令。
我的,在 OS X(使用 UTF-8)上可以处理得很好:
>>> print('\xdf')
ß
【讨论】:
如果他在运行程序之前执行chcp 65001
,他在windows中应该没问题,假设python检测到了
@Esailija:我收到反馈说这并不总是有效。我认为字体也需要切换。
对于ß
,可能不是。但也许对于更奇特的字符,默认的 windows cmd 提示字体可能不会:P
你是对的:它是终端的东西。如果我这样做 with open('tmp.txt', 'w', encoding='utf-8') as f: f.write(s)
它工作正常。您能否详细说明“尝试使用 chcp 65001”——这对我没有任何意义。
@mezhaka 你也可以修复终端,我刚刚安装了 python 3 并测试了 chcp 65001
的工作原理。在运行 python 文件之前,在终端中运行 chcp 65001
。以上是关于为啥 Python 不能识别我的 utf-8 编码源文件?的主要内容,如果未能解决你的问题,请参考以下文章