Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 26, 2007 10:21:14

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

Итак, есть сервер базы данных, в котором все данные хранятся в ср866. Он может выдавать сообщения, естественно, в этой кодировке. К примеру такое:
(-836, ‘isc_dsql_execute: exception 9. \x8f\xae\xaf\xeb\xe2\xaa\xa0 \xe3\xa4\xa0\xab\xa8\xe2\xec \xe1\xaf\xa8\xe1\xa0\xad\xad\xeb\xa9 \xaf\xe0\xa8\xe5\xae\xa4. ’)

Тоесть, как я понимаю - это ср866, но представленный в юникоде. У кого есть какие мысли, как вернуть его в ср866 или вообще заставить его читаться нормально в том же юникоде?



Офлайн

#2 Янв. 26, 2007 10:47:52

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

ПЕрекодировка.

Это не unicode. Это текст в cp866.

>>> a = 'текст в utf-8'
>>> a
'\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82 \xd0\xb2 utf-8'
>>> print a
текст в utf-8
>>> b = u'текст в unicode'
>>> b
u'\u0442\u0435\u043a\u0441\u0442 \u0432 unicode'
>>> print b
текст в unicode



Офлайн

#3 Янв. 26, 2007 11:06:00

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

j2a
Это не unicode. Это текст в cp866.
Я это понимаю. Не понимаю, как его в читабельный вид можно привести.
Например, я делаю
a = "(-836, 'isc_dsql_execute: exception 9. \x8f\xae\xaf\xeb\xe2\xaa\xa0 \xe3\xa4\xa0\xab\xa8\xe2\xec \xe1\xaf\xa8\xe1\xa0\xad\xad\xeb\xa9 \xaf\xe0\xa8\xe5\xae\xa4. ')"
a = unicode(a, 'cp866')
print a
(-836, 'isc_dsql_execute: exception 9. Попытка удалить списанный приход. ')
тоже, но во время исполнения
except:
exc_type, exc_value = sys.exc_info()[:2]
exc_type = '%s' % exc_type
exc_value = '%s' % exc_value
exc_value = unicode(exc_value, 'cp866')

(-836, 'isc_dsql_execute: exception 9. \x8f\xae\xaf\xeb\xe2\xaa\xa0 \xe3\xa4\xa0\xab\xa8\xe2\xec \xe1\xaf\xa8\xe1\xa0\xad\xad\xeb\xa9 \xaf\xe0\xa8\xe5\xae\xa4. ')
Вот и спрашиваю, какие есть идеи.



Отредактировано (Янв. 26, 2007 11:47:50)

Офлайн

#4 Янв. 26, 2007 12:22:53

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

ПЕрекодировка.

Эээээ. Перечитай еще раз мой код. Обрати внимание, что получается если сделать print и что получается, если просто “показать” переменную. Сравни со своей ситуацией.



Офлайн

#5 Янв. 26, 2007 12:33:18

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

j2a
Эээээ. Перечитай еще раз мой код. Обрати внимание, что получается если сделать print и что получается, если просто “показать” переменную. Сравни со своей ситуацией.
Заметил. Я просто забыл дописать print во 2-м коде.
Вот код
try:
con.cursor().execute('delete from PDB_DETAILIN where id=19')
except:
exc_type, exc_value = sys.exc_info()[:2]
exc_type = '%s' % exc_type
exc_value = '%s' % exc_value
exc_value = unicode(exc_value, 'cp866')
print exc_value

Выдает
(-836, 'isc_dsql_execute: exception 9. \x8f\xae\xaf\xeb\xe2\xaa\xa0 \xe3\xa4\xa0\xab\xa8\xe2\xec \xe1\xaf\xa8\xe1\xa0\xad\xad\xeb\xa9 \xaf\xe0\xa8\xe5\xae\xa4. ')
Я думаю тут дело в этой строчке
exc_value = ‘%s’ % exc_value

Когда я вывод копипастил (см. код 1) - все нормально, а вот когда преобразую вывод в юникод, тогда все идет лесом.



Офлайн

#6 Янв. 26, 2007 13:11:34

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

Нанел причину. Это я проглючил. Ошибка была в

balu
    exc_value = '%s' % exc_value
Надо было так:
    exc_value = '%s' % exc_value[1]



Офлайн

#7 Июль 4, 2007 10:21:34

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

Всем привет, у меня возникла следующая проблема: когда я перехватываю вывод команды dsquery в Windows XP, получаю каракули вместо русских симфолов. Пробовал следующий метод:

i = i.decode ('cp866')
i = i.encode ('cp1251')
получаю вообще пустые строки. Не подскажете, как решить проблему?



Офлайн

#8 Июль 4, 2007 15:08:36

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

выложи пожалуйста эти “каракули”



Офлайн

#9 Июль 4, 2007 15:14:53

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

попробуй убрать try except

>>> i=unicode('Текст','cp866').encode('cp866')
>>> i=i.decode('cp866')
>>> i.encode('cp1251')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "encodings/cp1251.py", line 18, in encode
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2568' in position 0: character maps to <undefined>
well
меня возникла следующая проблема: когда я перехватываю вывод команды dsquery в Windows XP,
объясни что и как ты делаешь, а то мне напиример не понятно dsquery консольная утилита или приложение под вин32



Офлайн

#10 Июль 4, 2007 15:17:51

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

ПЕрекодировка.

попробуй просто так
i = i.decode('cp1251')



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version