2014-09-30 72 views
2

你去告诉我读PEP 0263之前,请继续阅读...Python 3源文件支持哪些文件编码?

我无法找到细节的文件编码都支持Python 3的源文件任何文件。

我发现了数百(数千?)个问题,答案,帖子,电子邮件等,关于如何声明 - 在源文件的顶部 - 该源文件的编码,但它们都不回答我的问题题。多多包涵,想象做(或实际尝试)以下:

  1. 打开记事本(我使用的是Windows 7的普通的旧记事本,但我怀疑它的事项,我敢肯定,你的上级编辑器可以做一些事情。类似)
  2. 输入自己喜欢的Python代码(我用print('Hello, world!')
  3. 选择 “文件” 行 - > “保存”
  4. 选择一个文件夹和文件名(我用“E:\ TEMP \打招呼。 py“)
  5. 将”Encoding:“设置从默认的”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 

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

所以我去阅读PEP 0263 - 和一切关于它 - 在网络上,我尝试添加注释这样的文件

# coding: utf-16 

与所有种类的不同值的第一线编码,并没有什么帮助。 但它不能帮助,对不对?因为Python甚至没有我的编码声明;它窒息了源文件的第一个字节!

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

  1. 为什么不能Python的3解释读取这个文件?
  2. 如果不支持“Unicode”或“UCS-2 Little Endian”或“UTF-16”或不管是什么?

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

你可以从上到下发布你的整个hello.py文件,包括“shebang”'#!/ bin/env python'或其他东西。另外,你编译的选项可能会有所帮助:'import sysconfig; print(sysconfig.get_config_vars())' – jedwards 2014-10-01 00:13:50

+0

@jedwards该文件包含一行代码,如上所述。 – aldo 2014-10-01 00:25:39

+0

@also,谢谢你的“澄清”,但它没有什么帮助。这就是说,也许咨询[this](https://docs.python.org/2/library/codecs.html#standard-encodings)。我不知道它是否是你感兴趣的列表,但似乎是可行的。祝你的问题... – jedwards 2014-10-01 00:30:35

回答

5

源编码必须是:

  1. 由有关Python版本支持的编码(这通过版本和平台而异,例如,你只能在Windows上获得mbcs。)

  2. 松散的ASCII兼容,足以使声明可以使用ascii读取,这是在读取任何声明之前的初始源编码。见PEP0263“概念”的第1项

的Windows误导所谓的“统一”的编码,UTF-16LE,是不是ASCII兼容(通常是问题的一个桶,你应该尽量避免使用)。 Python需要特殊的编码特定的支持来检测UTF-16源文件,目前该功能已被declined使用。

您应该使用的# coding:几乎总是UTF-8。

+0

因此,PEP0263中的答案*('Concepts'项目1):“它不包括对所有字符(如UTF-16)使用两个或多个字节的编码。感谢那。在我发现的任何地方,这个要求并不是非常清楚,在您指出的错误/问题/功能请求(“无法用UTF16编写源代码”)中重复了一个投诉。谢谢你的参考。非常感激! – aldo 2014-10-01 16:28:37

+0

Python3代码是unicode。当从外部源读取字节时,解释器会采用UTF-8编码,除非第一行在可选#!之后。行否则说。同样,除非另有指示,否则Idle使用utf-8编码进行写入。所以不需要显式的UTF-8。 – 2014-10-02 06:24:28

相关问题