2

Подключение к базе данных (Pervasive).

Кодировка базы - cp866. ОС - Windows

Не могу вывести в консоль кириллицу.

import pyodbc
dbfile = pyodbc.connect('DSN=test')
cursor = dbfile.cursor()
cursor.execute("select NameAccount from account_dbt")
row = cursor.fetchall()
for l in range(4):
    t = str(row[l][0])
    print(t)

Результат:

ЋЋЋ ђ®¬ иЄ  Ћ¤Ё­(Romashka odin)
ЋЋЋ ђ®¬ иЄ  Ћ¤Ё­(Romashka odin) - 2
ЋЋЋ ђ®¬ иЄ  Ћ¤Ё­(Romashka odin) - 3
ЋЋЋ ђ®¬ иЄ  Ћ¤Ё­(Romashka odin) - 4

Пробовал так:

t = str(row[l][0]).encode('utf-8')

Результат:

b'\xd0\x8b\xd0\x8b\xd0\x8b \xd1\x92\xc2\xae\xc2\xac\xc2\xa0\xd0\xb8\xd0\x84\xc2\xa0 \xd0\x8b\xc2\xa4\xd0\x81\xc2\xad(Romashka odin)'
b'\xd0\x8b\xd0\x8b\xd0\x8b \xd1\x92\xc2\xae\xc2\xac\xc2\xa0\xd0\xb8\xd0\x84\xc2\xa0 \xd0\x8b\xc2\xa4\xd0\x81\xc2\xad(Romashka odin) - 2'
b'\xd0\x8b\xd0\x8b\xd0\x8b \xd1\x92\xc2\xae\xc2\xac\xc2\xa0\xd0\xb8\xd0\x84\xc2\xa0 \xd0\x8b\xc2\xa4\xd0\x81\xc2\xad(Romashka odin) - 3'
b'\xd0\x8b\xd0\x8b\xd0\x8b \xd1\x92\xc2\xae\xc2\xac\xc2\xa0\xd0\xb8\xd0\x84\xc2\xa0 \xd0\x8b\xc2\xa4\xd0\x81\xc2\xad(Romashka odin) - 4'

Статья на хабре про кодировки тоже не внесла ясность.

Как отобразить текст в читабельном виде?

  • попробуйте указать charset. не знаю, как это интерпретируется кодом pyodbc, поэтому я бы сначала попробовал указать utf8, и, если это не приведёт к каким-то визуальным изменениям, то cp866 (или как оно должно правильно называться в используемой вами операционной системе). – aleksandr barakin Jul 31 '15 at 07:25
  • @alexander barakin, указывал при подключении и UTF8 и CP866. Результат тот же. – Evgeny Bulokhov Jul 31 '15 at 07:40
  • если пробовали, тогда, мне кажется, стоит об этом явно упомянуть в тексте вопроса. – aleksandr barakin Jul 31 '15 at 07:47
  • Windows, Linux? Не знаю насчёт Linux, но у Windows весьма своебразная консоль у которой свои счёты с кодировками. Попробуйте для начала вывести в файл, чтобы понять когда код работает правильно. После этого терзайте уже консоль. Копайте в сторону команды CHCP. Мое решение в Python2 было совсем страшное: http://stackoverflow.com/questions/878972/windows-cmd-encoding-change-causes-python-crash/3259271#3259271 и вот это ещё можете глянуть: http://stackoverflow.com/questions/14109024/how-to-make-unicode-charset-in-cmd-exe-by-default – Petr Abdulin Jul 31 '15 at 07:53
  • Ваше решение либо неверное, либо неправильно понято. По крайней мере, вы в нем делаете совершенно не то, что объясняете. – Pavel Mayorov Jul 31 '15 at 11:04
  • Прошу прощения. Поправил. – Evgeny Bulokhov Jul 31 '15 at 11:31
  • 2
    не следует ответ на вопрос помещать в сам вопрос. Опубликуйте его как ответ (чтобы можно было голосовать, комментировать и т.д.) – jfs Aug 02 '15 at 01:25
  • не следует str() использовать без надобности. Что print(ascii(row[l][0])) показывает? – jfs Aug 02 '15 at 01:29
  • @jfs, Вот вывод:
    ''\u040b\u040b\u040b \u0452\xae\xac\xa0\u0438\u0404\xa0 \u040b\xa4\u0401\xad(Romashka odin)''
    – Evgeny Bulokhov Aug 04 '15 at 09:38
  • да, действительно проблема в том что текст закодированный с помощью cp866 интерпретируется с помощью неверной для него cp1251 кодировки (locale.getpreferredencoding(False)?) и rows = [row.encode('mbcs').decode('cp866') for row in cursor.fetchall()] позволяет обойти проблему. По-хорошему следует узнать на каком этапе cp1251 применяется (добавляются ли уже неверные данные в базу данных или только при извлечении из базы портятся (попробовать настройки соединения (кодировку) изменить)). – jfs Aug 04 '15 at 11:28

1 Answers1

1

Решение:

t = str(row[l][0]).encode('cp1251'), encoding='cp866')

Сначала строка row[l][0] переводится в байтовую строку в кодировке cp1251, а потом в обычную строку в кодировке cp1251.