Кириллица в Bash и Python под Linux

Надеюсь, что кто-нибудь решал проблему и подскажет. Отмечено на ОС: GNU/Debian 6-7, Linux Mint 9-15 (32 и 64 битных).

При выводе сообщений об ошибках в баш кодировка косячит:

postgres@home:~$ psql -U qwerty
psql: ?????:  ???????????? "qwerty" ?? ?????? ???????? ??????????? (Peer)

Но! Непосредственно в psql и pgAdmin III выводит нормально:

postgres@home:~$ psql
psql (9.1.11)
Введите "help", чтобы получить справку.
 
postgres=# SHOW client_encoding;
 client_encoding 
-----------------
 UTF8
(1 строка)
 
postgres=# \q

Аналогично, с крякозябликами, выходят все сообщения через python-драйвер "postgresql_psycopg2" (видимо ответы снимаются через тот же shell). Хоть в ORM Django, хоть в самописном коде...

Системная локаль по дефолту для данных дистибутивов:

postgres@home:~$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
postgres@home:~$ locale -a
C
C.UTF-8
POSIX
ru_RU.utf8

Кусок конфига в /etc/postgresql/9.1/main/postgresql.conf (тоже всё по дефолту):

...
# - Locale and Formatting -
 
datestyle = 'iso, dmy'
#intervalstyle = 'postgres'
#timezone = '(defaults to server environment setting)'
#timezone_abbreviations = 'Default'     # Select the set of available time zone
                                        # abbreviations.  Currently, there are
                                        #   Default
                                        #   Australia
                                        #   India
                                        # You can create your own file in
                                        # share/timezonesets/.
#extra_float_digits = 0                 # min -15, max 3
#client_encoding = sql_ascii            # actually, defaults to database
                                        # encoding
 
# These settings are initialized by initdb, but they can be changed.
#lc_messages = 'C'
lc_messages = 'ru_RU.UTF-8'                     # locale for system error message
                                        # strings
lc_monetary = 'ru_RU.UTF-8'                     # locale for monetary formatting
lc_numeric = 'ru_RU.UTF-8'                      # locale for number formatting
lc_time = 'ru_RU.UTF-8'                         # locale for time formatting
...

Вообщем, ай нид хелп!

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

попробуйте перед запуском

Изображение Игорь

попробуйте перед запуском
 psql -U qwerty

выполнить
 export SHAPE_ENCODING=UTF-8

если поможет, закиньте команду в профайл пользователя

Не помогло

К сожалению...

А что вам в bash показывает

А что вам в bash показывает команда:

$ echo $LANG

Выводит, как и положено

ru_RU.UTF-8
Выше уже показывал эту переменную...

Ок. А терминал в котором вы

Ок. А терминал в котором вы это всё выводите настроен на работу с UTF-8?
Если да, то у меня последняя гипотеза, что перевод интерфейса psql в дистрибутивном пакете вашего PostgreSQL не в UTF-8, а например с koi8-r. Это можно проверить если глянуть в
/usr/share/locale/ru/LC_MESSAGES/psql-8.4.mo (путь для CentOS в вашем дистрибутиве может отличаться)

Тоже подозреваю

Что данная проблема как то связана либо с майнтейнерами Debian, либо с программистами psql. Но и одновременно, думается, что за несколько лет уже бы устранили данный баг.
cat /usr/share/locale/ru/LC_MESSAGES/psql-9.1.mo
Говорит, что всё прелестно, UTF-8. Этими месседжами в самом psql оперирует отлично.

Вообще, по моим ощущениям, кажется что происходит двойной encode при выводе в консоль баша из перловского /usr/bin/psql, но в нём я не силён...

Ой не понимаю я. Во-первых, с

Ой не понимаю я. Во-первых, с чего вы взяли, что psql - это perl'овская программа? Это самый обычный бинарник.
Во-вторых, причин появления ? в консоли может быть несколько. Перечислю все, что мне приходят в голову:
1. В консоли выбран неподдерживаемый шрифт. Но если у вас консоль UTF-8 и вы спокойно видите в ней русские буквы, то проблема не в этом.
2. В приложении неправильно установлена локаль для работы с консолью. Но уже давно psql смотрит в LANG в LC_MESSAGES. Так что если сборщики пакетов не нахимичили и этот вариант отпадает.
3. Неправильно скомилирован .mo файл. Как оказалось тоже мимо.

Другие варианты мне неизвестны. Если у вас локаль ru_RU.UTF-8, шрифт в консоли поддерживает кириллицу, другие программы прекрасно выводят русские буквы в UTF-8 - должно работать!

$ psql -U qwerty
psql: ВАЖНО: пользователь "qwerty" не прошёл проверку подлинности (Peer)

Ещё один совершенно безумный вариант, но тем не менее. Может быть у вас именно ЭТО сообщение не переведено правильно?
Прицепляю мой файл: /usr/share/locale/ru/LC_MESSAGES/psql-9.2.mo
попробуйте его положить вместо вашего.
http://yadi.sk/d/VfOqxGNaGRHvE

Поставил на виртуалку CentOS

Понимаю Ваше недопонимание. Действительно, в CentOS команда:
$ cat $(which psql) | less
показывает бинарник, а в Debian (Ubuntu и иже с ними) psql - это perl-овый скрипт (/usr/bin/psql), который согласно версии запускает уже бинарник /usr/lib/postgresql/9.1/bin/psql
Но и даже запуск непосредственно:

postgres@p633m:~$ /usr/lib/postgresql/9.1/bin/psql -U qwerty
psql: ?????:  ???????????? "qwerty" ?? ?????? ???????? ??????????? (Peer)

Так что теперь понятно, что дело не в перловом скрипте, а в сборке самого клиента.
Может кто хорошо с английским дружит, напишет всё обозначенное выше в багтрекер дебиана? А оттуда всё по убунтодистрам разойдётся...

Нашёл решение

После того как связался с майнтейнером пакета в Debian, он подсказал, что в текущей стабильной ветке дебиана исправление врятли появится, а вот в testing/unstable - скорее всего. Также подсказал, что можно подключить дополнительный репозиторий с любой версией postgresql с последними исправлениями.
apt.postgresql.org
Но просто так, обновлением постгресса не обойтись. Впрочем, можно и вообще без обновления.
Просто нужно подправить файл настройки окружения самого сервера:

root@wheezy:~# echo "LANG='ru_RU.UTF-8'" >> /etc/postgresql/9.1/main/environment
root@wheezy:~# service postgresql restart
root@wheezy:~# psql -U qwerty
psql: ВАЖНО:  пользователь "qwerty" не прошёл проверку подлинности (Peer)

А ларчик просто открывался... :)

Ну если это считать просто,

Ну если это считать просто, то я уже не знаю...
Это какая-то безумная специфика Debian'а и в который раз убеждаюсь, что правильно я с него ушёл на RedHat в своё время.
Сколько людей вопросы задавало по PostgreSQL в Linux ни у кого таких чудес не наблюдалось.

/etc/postgresql/9.1/main/environment

В CentOS и в остальных дистрах, которые мне встречались, я такого файла вообще не встречал, нету его.

Смотря как на это взглянуть...

Это можно сказать единственный момент, над которым пришлось потрудится в Debian. Потому и просил помощи здесь.
Я наоборот, в CentOS и RedHat множество неудобств для себя обнаруживаю, связанных с другими важными для меня инструментами...
Кстати! Это ещё одно решение: убрать совсем этот файл, проверил сейчас - работает как надо!
Видимо майнтейнеры в RedHat сталкивались с этой темой и решили убрать его совсем...

Вы заблуждаетесь. Его не

Вы заблуждаетесь. Его не решили убрать, а его просто нету. В стандартном PostgreSQL я имею в виду. Это как раз "передовые" разработки дебианщиков :)

Ну да, о вкусах не спорят. Я ушлёл с Дебиан, когда понял, что я трачу кучу времени и постоянно занимаюсь настройками системы вместо того, чтобы в ней просто работать сразу после установки. Смешно, конечно, но тогда Дебиан гордо анонсировал свою мегакрутую систему настройки пакетов до их установки, а РедХат ничего не анонсировал, но зато у них уже был графический установщик системы, а установленные пакеты (о чудо) работали сразу почему-то без настроек. :)

А для себя я понял одну вещь - удобство понятие субъективное. Единственное неудобство РедХат для пользователей Дебиан состоит в том, что в РедХат НЕ ТАК, как в Дебиан. А если освоить РедХат, то понимаешь, что всё очень даже логично и правильно! ;)

Хм, у меня дебиан 6, в

Изображение Игорь

Хм, у меня дебиан 6, в environment ничего нет, кириллицу отображает правлино, posstgres 8.4

Видите, если даже в рамках

Видите, если даже в рамках одного дистрибутива кто в лес кто по дрова, то о чём говорить?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023