在你告诉我阅读PEP 0263之前,请继续阅读......
我找不到任何详细说明 Python 3源文件支持哪些文件编码的文档。
我发现了数百(数千?)个问题,答案,帖子,电子邮件等,关于如何在源文件的顶部声明该源文件的编码,但没有一个回答我的问题。忍受我,并想象做(或实际尝试)以下:
print( 'Hello, world!' )
)这是我得到的输出:
E:\Temp>python --version
Python 3.4.1
E:\Temp>python "hello.py"
File "hello.py", line 1
SyntaxError: Non-UTF-8 code starting with '\xff' in file hello.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
现在,当我在Notepad++中打开同一个文件并查看"编码"菜单,它有选项"编码在UCS-2 Little Endian"选择。 Wikipedia tells me这基本上是UTF-16编码。随你。我真的不在乎。更多研究表明,我的编辑器插入了一个双字节BOM(字节顺序标记),其值为' \ xff \ xfe'在文件的前面指示文件编码。所以至少我知道' \ xff' Python抱怨的代码来自。
所以我在网上阅读PEP 0263 - 以及其他所有相关内容 - 我尝试在文件的第一行添加这样的评论
# coding: utf-16
具有各种不同的编码值,没有任何帮助。 但它无济于事,对吗?因为Python甚至没有达到我的编码声明;它扼杀了源文件的第一个字节!
所以我真正想知道的是......
P.S。我甚至发现another question on StackOverflow这似乎是我遇到的确切问题,但它在我看来是错误的 - 作为重复。 :(
---编辑---
有人要求我编译选项"。这是一些输出。也许会有所帮助?
E:\Temp>python
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:38:22) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sysconfig
>>> print( sysconfig.get_config_vars() )
{'EXT_SUFFIX': '.pyd', 'srcdir': 'C:\\Python34', 'py_version_short': '3.4', 'base': 'C:\\Python34', 'prefix': 'C:\\Python34', 'projectbase': 'C:\\Python34', 'INCLUDEPY': 'C:\\Python34\\Include', 'platbase': 'C:\\Python34', 'py_version_nodot': '34', 'exec_prefix': 'C:\\Python34', 'EXE': '.exe', 'installed_base': 'C:\\Python34', 'SO': '.pyd', 'installed_platbase': 'C:\\Python34', 'VERSION': '34', 'BINLIBDEST': 'C:\\Python34\\Lib', 'LIBDEST': 'C:\\Python34\\Lib', 'userbase': 'C:\\Users\\alonghi\\AppData\\Roaming\\Python', 'py_version': '3.4.1', 'abiflags': '', 'BINDIR': 'C:\\Python34'}
>>>
答案 0 :(得分:5)
源编码必须是:
有问题的Python版本支持的编码。 (这取决于版本和平台,例如,您只能在Windows上获得mbcs
。)
松散地与ASCII兼容,足以使用# coding:
来读取ascii
声明,# coding:
是在读取任何声明之前的初始源编码。请参阅PEP0263'概念'第1项。
Windows误导性地称为“Unicode”UTF-16LE的编码与ASCII不兼容(通常是您应该尽量避免使用的一系列问题)。 Python需要特殊的特定于编码的支持才能检测UTF-16源文件,此功能目前已为declined。
你应该使用的{{1}}几乎总是UTF-8。