2015-07-17 2 views
6

Я использую Python 3 (недавно переключился с Python 2). Мой код обычно работает на Linux, но иногда (не часто) на Windows. Согласно документации Python 3 для open(), кодировка по умолчанию для текстового файла составляет от locale.getpreferredencoding(), если аргумент encoding не указан. Я хочу, чтобы это значение по умолчанию было utf-8 для моего проекта, независимо от того, на какой ОС он работает (в настоящее время это всегда UTF-8 для Linux, но не для Windows). В проекте много звонков open(), и я не хочу добавлять encoding='utf-8' всем им. Таким образом, я хочу изменить предпочтительную кодировку языка в Windows, как это видит Python 3.Изменение «предпочтительной кодировки языка» в Python 3 в Windows

Я нашел предыдущий вопрос «Changing the "locale preferred encoding"», который принял принятый ответ, поэтому я подумал, что я должен идти. Но, к сожалению, ни одна из предложенных команд в этом ответе и первый комментарий для меня не работают в Windows. В частности, этот принятый ответ и его первый комментарий предполагают запуск chcp 65001 и set PYTHONIOENCODING=UTF-8, и я пробовал оба. Пожалуйста, смотрите расшифровку ниже моего окна CMD:

> py -i 
Python 3.4.3 ... 
>>> f = open('foo.txt', 'w') 
>>> f.encoding 
'cp1252' 
>>> exit() 

> chcp 65001 
Active code page: 65001 

> py -i 
Python 3.4.3 ... 
>>> f = open('foo.txt', 'w') 
>>> f.encoding 
'cp1252' 
>>> exit() 

> set PYTHONIOENCODING=UTF-8 

> py -i 
Python 3.4.3 ... 
>>> f = open('foo.txt', 'w') 
>>> f.encoding 
'cp1252' 
>>> exit() 

Обратите внимание, что даже после того, как предложили команды, кодирование моего открываемого файла по-прежнему cp1252 вместо предполагаемого utf-8.

+0

Возможно, это только мой стиль, но я бы предпочел написать функцию open() оболочки, в которой вы указываете кодировку. –

+0

Не используйте 'chcp 65001'. Консоль Windows неправильно поддерживает UTF-8, и в любом случае она не делает то, что вы хотите. 'locale.getpreferredencoding' не имеет никакого отношения к кодовой странице консоли; он основан на кодировке ANSI в локали Windows. Например, если вы вызываете Win32 'CreateFileA' (ANSI) вместо' CreateFileW' (UTF-16), строка пути файла декодируется как строка ANSI (например, Windows-1252). Windows не позволяет использовать UTF-8 в качестве набора символов ANSI, а среда выполнения C также не позволяет использовать UTF-8 для локали. – eryksun

+0

@eryksun Спасибо за информацию, но для меня слишком много жаргонов для Windows. Я редко использую Windows. Все, что я хочу, это способ сказать либо Windows 8, либо Python 3: «Дорогой Windows 8/Python 3, Пожалуйста, имейте в виду, что все текстовые файлы на этом компьютере должны быть закодированы в UTF-8 без исключения. в будущем при открытии текстовых файлов. – walrus

ответ

3

я знаю его реальный Hacky обходного пути, но вы можете переопределить функцию locale.getpreferredencoding() следующим образом:

import locale 
def getpreferredencoding(do_setlocale = True): 
    return "utf-8" 
locale.getpreferredencoding = getpreferredencoding 

если запустить это на ранней стадии, все файлы, открытый после (в Lest в моем тестировании на Win XP машина), открытый в utf-8, и поскольку это переопределяет метод модуля, это применимо ко всем платформам.

+0

Я тестировал его на python 3.5.1 и Windows 7 и [посмотрел] (http://stackoverflow.com/a/34345136/4933641), в чем я оказался. – axil

3

По python3.5.1 этот хак выглядит следующим образом:

import _locale 
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8']) 

Все файлы, открытые после этого будем считать кодировку по умолчанию будет utf8.

+0

Или еще лучше, 'utf_8_sig', поскольку он позаботится о знаке спецификации, который некоторые редакторы Windows имеют тенденцию вставлять в файлы даже для такой кодировки, ориентированной на endian, как' utf8'. – axil

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