?

Log in

No account? Create an account

Python и кодировки

« previous entry | next entry »
Mar. 17th, 2007 | 04:03 am

Сначала ссылка - самое подробное рассмотрение проблем кодировок и юникода в питоне. Внятно, но по аглицки [>>>]
Теперь от себя - у меня есть код, который мигрирует из проекта в проект последние 2 года. Он позволяет забыть про проблемы кодировок на какое-то время. Выглядит он примерно так:
#!/usr/bin/env python2.5
# -*- coding: utf-8 -*-
# Конечно в нормальной жизни этих коментариев тут нет
# Загрузить кодеки и библиотеку локалей, установить дефолтную локаль согласно
# переменной окружения LC_ALL.
import locale, codecs; locale.setlocale(locale.LC_ALL, '')
# Теперь в encoding положим текущая кодировку локали.
encoding = locale.getlocale()[1]
# Если кодировка не определилась - это винды. Там полюбому UTF-8 :)
if not encoding:
    encoding = "utf-8"
# Установим дефолтную локаль. Финт с ушами reload() нужен потому что разработчики
# питона дюже умные и логично удаляют функцию setdefaultencoding при загрузке.
# Оно в общем то логично, но я же умный.
import sys;reload(sys);sys.setdefaultencoding(encoding)
# Установили кодеки для вывода в потоки согласно распорядку.
sys.stdout = codecs.getwriter(encoding)(sys.stdout, errors = "replace")
sys.stderr = codecs.getwriter(encoding)(sys.stderr, errors = "replace")

Link | Leave a comment |

Comments {2}

i_love_python

(no subject)

from: i_love_python
date: Nov. 17th, 2007 06:36 pm (UTC)
Link

под виндой юзать utf-8 -- это издевательство над юзерами.
можно хотя бы так спросить: locale.getpreferredencoding()

Reply | Thread

frotmnenogi

(no subject)

from: frotmnenogi
date: Dec. 9th, 2009 05:22 pm (UTC)
Link

Зачетно! Да, кстати, кодировка не всегда определяется нормально и в юнихах, если вспомнить про кронтаб и забыть про setenv LC_ALL.

Если приложений с одними настройками несколько (масса мелких скриптов), лучше это объявление сделать глобальным для всей инсталяции Python, разместив в файле "sitecustomize.py". Туда же можно добавить антикора-дамп:

sys.setrecursionlimit(512)

Reply | Thread