2014-12-12 2 views
4

Я уже несколько часов вытаскиваю волосы из этой проблемы.По умолчанию кодировка Python 3 в Open() под Windows. sys.getdefaultencoding() не соблюдается

У меня есть файл сообщения, который я хочу сгенерировать, используя команду makemessages от django, которая отлично работает в среде Linux, которая на самом деле корректно обрабатывает настройки локали. Однако, когда я пытаюсь сделать то же самое в Windows, каждый раз, когда python пытается открыть файл, он предполагает, что он закодирован в cp932 (SHIFT-JIS), что вызывает всевозможные хаосы.

Вручную добавляет encoding='utf-8' к каждому звонку open, но это вряд ли хороший способ устранить проблему. Есть ли способ заставить open использовать конкретную кодировку по умолчанию? 'UTF-8'

  • sys.getdefaultencoding() возвращается, по какой-то загадочной причине эта установка не соблюдается
  • PYTHONIOENCODING и PYTHONENCODING оба устанавливаются в 'UTF-8'
  • Мой код страницы устанавливается на cp65001

Это мой питон версия строка:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32

EDIT: Я заметил, что locale.getpreferredencoding() возвращает cp932, поэтому я думаю, что поиск локали Windows с utf-8 по умолчанию будет делать трюк. Существует ли такая вещь?

+2

Это может быть ошибка в 3.3 на Windows, если вы действительно не можете найти решение. С другой стороны, явное указание кодировки при вызове 'open()' не является плохой идеей. –

+0

Ну, я знаю, что явное указание на кодировку никогда не бывает плохой идеей, проблема в том, что замена всех вызовов на 'open' в соответствующих частях служебных программ Django нецелесообразна. Я обнаружил, что 'locale.getpreferredencoding()' возвращает 'cp932', так что это может быть проблемой. Есть ли локали Windows, которые устанавливают это в 'utf-8'? – mval

+0

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

ответ

2

Попробуйте

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.utf-8') 
Смежные вопросы