为啥 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 编码源文件?的主要内容,如果未能解决你的问题,请参考以下文章

一.编码的转换

HTML页面为啥设置了UTF-8仍然中文乱码

为啥JS文件中不能输入中文,编码格式已经改为UTF-8

为啥我的神经网络不能正确分类这些井字游戏模式?

为啥我的页面不能显示é,而是显示�?

什么是BOM头(字节顺序标记(ByteOrderMark))