Kinght who said PY! ([info]pythonini) wrote,

Python и кодировки

Сначала ссылка - самое подробное рассмотрение проблем кодировок и юникода в питоне. Внятно, но по аглицки [>>>]
Теперь от себя - у меня есть код, который мигрирует из проекта в проект последние 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")
Tags: charset, code, links, sample, unicode

  • Post a new comment

    Error

  • 2 comments

[info]i_love_python

November 17 2007, 18:36:54 UTC 4 years ago

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

[info]frotmnenogi

December 9 2009, 17:22:38 UTC 2 years ago

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

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

sys.setrecursionlimit(512)
Create an Account
Forgot your login or password?
Facebook Twitter More login options
English • Español • Deutsch • Русский…