LINUX.ORG.RU

[python] [unicode] Возможно ли закорючки в русский текст преобразовать

 ,


0

0

Есть сишная либа. она берет из некоторого источника текст (неюникодный), видимо неправильно его кодирует, и ее биндинг питоновский отдает его мой прорамме в виде latin1 вроде закорючек. Можно ли его раскодировать обратно как то?

Ты б написал подробнее как и что.

А вообще посмотри на chardet, может поможет.

anonymous
()
Ответ на: комментарий от k0l0b0k

Есть же str.encode и str.decode. Зачем отдельные баиндинги к iconv крутить?

balodja ★★★
()
nkt@doriath ~ % eix chardet
[I] dev-python/chardet
     Available versions:  1.0.1 2.0.1
     Installed versions:  2.0.1(16:52:06 01/03/10)
     Homepage:            http://chardet.feedparser.org/ http://code.google.com/p/chardet/
     Description:         Character encoding auto-detection in Python.
fat_angel ★★★★★
()
Ответ на: комментарий от k0l0b0k

http://pypi.python.org/pypi/iconv/1.0 не работает?

Дела давно минувших дней, Преданья старины глубокой.

==================

ТС: chardet может не помочь. Руками определяешь кодировку и str.decode.

baverman ★★★
()

print st
print chardet.detect(st)

выдает



что делать? st изначально было строкой в windows 1251, система работает на utf локали, есстественно
как оно превратилось в такое?


Èíòåðòåëåêîì
Traceback (most recent call last):
File «/home/darvin/workspace/indicator-calendar/src/minical/minical.py», line 14, in <module>
runner = runner_tray.RunnerTray()
File «/home/darvin/workspace/indicator-calendar/src/minical/runner_tray.py», line 35, in __init__
super(RunnerTray,self).__init__()
File «/home/darvin/workspace/indicator-calendar/src/minical/runner.py», line 41, in __init__
self.refresh_calendar_source()
File «/home/darvin/workspace/indicator-calendar/src/minical/runner.py», line 64, in refresh_calendar_source
self.window.refresh_date()
File «/home/darvin/workspace/indicator-calendar/src/minical/window.py», line 77, in refresh_date
self.redraw_events()
File «/home/darvin/workspace/indicator-calendar/src/minical/window.py», line 91, in redraw_events
events = self.calsource.get_events_by_date(date)
File «/home/darvin/workspace/indicator-calendar/src/minical/calsource_jpilot.py», line 31, in get_events_by_date
result[date] = self.decode(app[«description»])
File «/home/darvin/workspace/indicator-calendar/src/minical/calsource_jpilot.py», line 24, in decode
print chardet.detect(st)
File «/usr/lib/pymodules/python2.6/chardet/__init__.py», line 24, in detect
u.feed(aBuf)
File «/usr/lib/pymodules/python2.6/chardet/universaldetector.py», line 115, in feed
if prober.feed(aBuf) == constants.eFoundIt:
File «/usr/lib/pymodules/python2.6/chardet/charsetgroupprober.py», line 59, in feed
st = prober.feed(aBuf)
File «/usr/lib/pymodules/python2.6/chardet/sjisprober.py», line 67, in feed
self._mContextAnalyzer.feed(self._mLastChar[2 - charLen :], charLen)
File «/usr/lib/pymodules/python2.6/chardet/jpcntx.py», line 145, in feed
order, charLen = self.get_order(aBuf[i:i+2])
File «/usr/lib/pymodules/python2.6/chardet/jpcntx.py», line 176, in get_order
if ((aStr[0] >= '\x81') and (aStr[0] <= '\x9F')) or \
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte

nbdarvin
() автор топика
Ответ на: комментарий от nbdarvin

Ты явно что-то не так делаешь.

Во-первых: chardet не панацея, конкретно в этом примере он ошибочно предполагает, что кодировка 'MacCyrillic'.

Во-вторых: хватит уже глупостями заниматься — st.decode('cp1251')

baverman ★★★
()
Ответ на: комментарий от nbdarvin

> print st.decode(«cp1251»)

print st


ðà ç äâà òðè

ðàç äâà òðè



Такой результат получается, если st закодирована в utf-8.

Чтобы ее раскодировать нужно выполнить:

s.decode('utf-8').encode('cp1252').decode('cp1251')


Ты уж разберись, в каком формате у тебя строчки приходят.

import array
print type(st)
print array.array('c', st)

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.