2014-09-30 3 views
2

Перед тем, как идти говоря мне читать PEP 0263, продолжайте читать ...Какие кодировки файлов поддерживаются для исходных файлов Python 3?

Я не могу найти никакой документации, которая детализирует , какие файловые кодировки поддерживаются для Python 3 исходных файлов.

Я нашел сотни (тысяч?) Вопросов, ответов, сообщений, писем и т. Д. О том, как объявить - в верхней части исходного файла - кодировку этого исходного файла, но никто из них не отвечает на мои вопрос. Медведь со мной, и представьте себе делать (или на самом деле попробовать) следующее:

  1. Откройте Блокнот (я использую обычный старый Блокнот на Windows 7, но я сомневаюсь, что это имеет значение, я уверен, что ваш начальник редактор может сделать что-то . подобное)
  2. Введите ваши любимые строки кода Python (я использовал print('Hello, world!'))
  3. Выберите «файл» -> «Сохранить»
  4. Выберите имя папки и файла (я использовал «E: \ Temp \ привет. 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 

сейчас , когда я открою этот же файл в Notepad++ и посмотрю меню «Кодирование», у него есть опция «Кодировать в UCS-2 Little Endian». Wikipedia tells me, что это в основном кодировка UTF-16. Без разницы. Мне все равно. Больше исследований показывает, что мой редактор вставил двухбайтную спецификацию (байтовый порядок) со значением «\ xff \ xfe» в передней части файла, чтобы указать кодировку файла. Так что, по крайней мере, я знаю, откуда приходит код «\ xff», из которого Python жалуется.

Так я иду и читать PEP 0263 - и все остальное относительно этого - в Интернете, и я пытаюсь добавить комментарий, как это к первой строке файла

# coding: utf-16 

со всеми видами различных значений кодирование, и ничего не помогает. Но это не может помочь, не так ли? Поскольку Python даже не добирается до моего объявления кодирования; Он задыхается от первого байта исходного файла!

Так что я действительно хочу знать ...

  1. Почему не интерпретатор Python 3 читать этот файл?
  2. Если «Unicode» или «UCS-2 Little Endian» или «UTF-16» или не поддерживается, что такое ???

P.S. Я даже нашел another question on StackOverflow, который, кажется, является точной проблемой, которую я имею, но он был закрыт - ошибочно, на мой взгляд, - как дубликат...? :(

--- EDIT ---

Кто-то просило мои "скомпилированные варианты" Вот некоторый выход Может быть, это поможет

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

+0

@jedwards Файл содержит одну строку кода, как указано. – aldo

+0

@также, спасибо за «разъяснение», но это мало помогает. При этом, возможно, обратитесь к [this] (https://docs.python.org/2/library/codecs.html#standard-encodings). Я не знаю, является ли это список, который вам интересен, но он кажется правдоподобным. Удачи вам в вашем вопросе ... – jedwards

ответ

5

кодирующей источник должен быть:

  1. кодирование поддерживается версией Python в вопросе. (Это зависит от версии и платформы, например, вы можете получить только mbcs на Windows).

  2. Loosely ASCII-совместимый, достаточно, чтобы объявление # coding: можно было читать с использованием ascii, который является исходной кодировкой источника перед чтением любого объявления. См пункт PEP0263 «Концепции» 1.

кодировке, Windows, обманчиво называет «Unicode», UTF-16LE, не ASCII-совместимый (и вообще бочонок проблем вы должны стараться избегать использования). Для обнаружения исходных файлов UTF-16 для Python потребуется специальная поддержка кодирования, и на данный момент эта функция была declined.

# coding: Вы должны использовать почти всегда UTF-8.

+0

Итак, ответ * был * там в PEP0263 (пункт 1 «Концепции»): «Он не включает кодировки, которые используют два или более байта для всех символов, например, UTF-16». Спасибо за это. Это требование не ясно изложено в любом месте, которое я нашел, жалоба, повторенная в указанном вами сообщении об ошибке/проблеме/функции-запросе («Невозможно записать исходный код в UTF16»). Спасибо за эту ссылку. Очень признателен! – aldo

+0

Код Python3 является unicode. При чтении байтов из внешнего источника интерпретатор предполагает кодировку UTF-8, если только первая строка после необязательного #! строка говорит иначе. Аналогично, Idle записывает с помощью кодировки utf-8, если не указано иное. Поэтому явный UTF-8 не нужен. –

Смежные вопросы