为什么Python不识别我的utf-8编码源文件?

Ant*_*yko 17 python encoding utf-8 python-3.x

这是一个带有非ASCII字符的tmp.py:

if __name__ == "__main__":
    s = 'ß'
    print(s)
Run Code Online (Sandbox Code Playgroud)

运行它我收到以下错误:

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>
Run Code Online (Sandbox Code Playgroud)

Python文档:

默认情况下,Python源文件被视为以UTF-8编码...

我检查编码的方法是使用Firefox(也许有人会建议更明显的东西).我在Firefox中打开tmp.py,如果我选择View-> Character Encoding-> Unicode(UTF-8),它看起来没问题,就像它在这个问题中看到的那样(wthß符号).

如果我把:

# -*- encoding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)

作为tmp.py中的第一个字符串,它不会改变任何内容 - 错误仍然存​​在.

有人可以帮我弄清楚我做错了什么吗?

Mar*_*ers 32

您的终端正在使用的编码不支持该字符:

>>> '\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>
Run Code Online (Sandbox Code Playgroud)

Python处理它很好,它是你的输出编码无法处理它.

您可以尝试chcp 65001在Windows控制台中使用切换代码页; chcp是一个用于更改代码页的Windows命令行命令.

我的OS X(使用UTF-8)可以很好地处理它:

>>> print('\xdf')
ß
Run Code Online (Sandbox Code Playgroud)

  • 你是对的:它是终极的东西.如果我用`open('tmp.txt','w',encoding ='utf-8')作为f:f.write(s)`它可以正常工作.你能详细说明"尝试使用chcp 65001" - 这对我没有任何意义. (5认同)