Python 3源文件支持哪些文件编码?

ald*_*ldo 2 python unicode encoding utf-8 python-3.x

在你告诉我阅读PEP 0263之前,请继续阅读......

我找不到任何文档,详细说明Python 3源文件支持哪些文件编码.

我发现了数百(数千?)个问题,答案,帖子,电子邮件等,关于如何在源文件的顶部声明该源文件的编码,但没有一个能回答我的问题.忍受我,并想象做(或实际尝试)以下:

  1. 打开记事本(我在Windows 7上使用普通的旧记事本,但我怀疑它很重要;我确信你的高级编辑可以做类似的事情.)
  2. 输入您最喜欢的Python代码行(我使用过print( 'Hello, world!' ))
  3. 选择"文件" - >"保存"
  4. 选择文件夹和文件名(我使用"E:\ Temp\hello.py")
  5. 将"编码:"设置从默认的"ANSI"更改为"Unicode"
  6. 按"保存"
  7. 打开命令提示符,切换到包含新文件的文件夹,然后尝试运行它

这是我得到的输出:

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

现在,当我在Notepad ++中打开同一个文件并查看"编码"菜单时,它会选择"在UCS-2 Little Endian中编码"选项. 维基百科告诉我,这基本上是UTF-16编码.随你.我真的不在乎.更多的研究表明,我的编辑器在文件的前面插入了一个两字节的BOM(字节顺序标记),其值为'\ xff\xfe',表示文件编码.所以至少我知道Python抱怨的'\ xff'代码来自哪里.

所以我去网上阅读PEP 0263 - 以及其他一切 - 我尝试在这个文件的第一行添加这样的评论

# coding: utf-16
Run Code Online (Sandbox Code Playgroud)

具有各种不同的编码值,没有任何帮助. 但它无能为力,对吧?因为Python甚至没有达到我的编码声明; 它在源文件的第一个字节上窒息!

所以我真正想知道的是......

  1. 为什么Python 3解释器不能读取此文件?
  2. 如果不支持"Unicode"或"UCS-2 Little Endian"或"UTF-16"或其他什么,那么???

PS我甚至在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'}
>>>
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 5

源编码必须是:

  1. 由相关Python版本支持的编码.(这取决于版本和平台,例如,您只能mbcs使用Windows.)

  2. 松散地与ASCII兼容,足以# coding:在读取ascii任何声明之前使用哪个是初始源编码来读取声明.请参阅PEP0263'概念'第1项.

Windows误导性地称为"Unicode"UTF-16LE的编码与ASCII不兼容(通常是您应该尽量避免使用的一系列问题).Python需要特殊的特定于编码的支持来检测UTF-16源文件,此功能目前已被拒绝.

# coding:你应该使用几乎总是UTF-8.