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

时间:2014-09-30 23:56:34

标签: python python-3.x unicode encoding utf-8

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

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

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

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

    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甚至没有达到我的编码声明;它扼杀了源文件的第一个字节!

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

    1. 为什么Python 3解释器无法读取此文件?
    2. 如果" Unicode"或者" UCS-2 Little Endian"或" UTF-16"或者不支持,什么是???
    3. 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'}
      >>>
      

1 个答案:

答案 0 :(得分:5)

源编码必须是:

  1. 有问题的Python版本支持的编码。 (这取决于版本和平台,例如,您只能在Windows上获得mbcs。)

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

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

    你应该使用的{{1}}几乎总是UTF-8。