2014-09-30 73 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

相關問題