Форум сайта python.su
вот инфа к размышлению
>>> good_unicode_object = u'йомайо' >>> bad_unicode_object_ = 'йомайо' >>> bad_unicode_object_ '\xd0\xb9\xd0\xbe\xd0\xbc\xd0\xb0\xd0\xb9\xd0\xbe' >>> bad_unicode_object = u'\xd0\xb9\xd0\xbe\xd0\xbc\xd0\xb0\xd0\xb9\xd0\xbe' # просто копипастим предыдущую строку >>> print good_unicode_object йомайо >>> print bad_unicode_object йомайо
Офлайн
redixin, это баг ipython.
duxa, покажи:
>>> x = tag.getArtist()
>>> repr(x)
P.S. Дело, стопудов, не в питоне, а в кривых тегах mp3-файла, в которых вместо latin-1 запихана cp1251, либо либе чтения id3-тегов, которая это не умеет обрабатывать явно.
Офлайн
redixinу меня точно такое же впечатление. но как распаковать юникод-объект и получить ‘str’ в чистом виде, чтобы можно было конвертнуть в utf-8?duxa
x - строка в кодировке cp1251 (содержит русский текст)
мне нужно конвертнуть ее в utf-8x.decode('cp1251') # декодирует строку из 1251 в юникод print x # выводит строку # запущеный в консоли питон сам в состоянии узнать в какой # кодировке твоя консоль чтобы вывести текст в правильной # кодировке. если выводить текст не в консоль а например # в файл то можно сделать чтото вроде print x.encode('utf8') # тупо отдаст на stdout строку в utf8
почему он выдет ерунду и говорит type ‘unicode’?
скорее всего потому что getArtist возвращает в unicode объекте 1251 строку
Офлайн
j2aтэги действительно кривые, в 1251 =)
redixin, это баг ipython.
duxa, покажи:
>>> x = tag.getArtist()
>>> repr(x)
P.S. Дело, стопудов, не в питоне, а в кривых тегах mp3-файла, в которых вместо latin-1 запихана cp1251, либо либе чтения id3-тегов, которая это не умеет обрабатывать явно.
Офлайн
x = tag.getArtist()
а не
x = tag.getArtist
разницу видите?
Офлайн
duxaобъясняю еще раз: юникод – это представление каждого символа в виде 2х или 4х байт. Там нет понятия кодировки. Поэтому он и называется юникодом.redixinу меня точно такое же впечатление. но как распаковать юникод-объект и получить ‘str’ в чистом виде, чтобы можно было конвертнуть в utf-8?duxa
x - строка в кодировке cp1251 (содержит русский текст)
мне нужно конвертнуть ее в utf-8x.decode('cp1251') # декодирует строку из 1251 в юникод print x # выводит строку # запущеный в консоли питон сам в состоянии узнать в какой # кодировке твоя консоль чтобы вывести текст в правильной # кодировке. если выводить текст не в консоль а например # в файл то можно сделать чтото вроде print x.encode('utf8') # тупо отдаст на stdout строку в utf8
почему он выдет ерунду и говорит type ‘unicode’?
скорее всего потому что getArtist возвращает в unicode объекте 1251 строку
Офлайн
bialixпардон, ступор
x = tag.getArtist()
а не
x = tag.getArtist
разницу видите?
Офлайн
оправдалось предположение о том, что при кодировании в юникод либа для чтения тэгов была уверена что исходная строка в latin-1 а не в cp1251
поэтому обратная последовательность действий привела к ожидаемому результату:
>>> import eyeD3
>>> tag=eyeD3.Tag()
>>> tag.link(“test.mp3”)
1
>>> x=tag.getArtist()
>>> x
u'\xd2\xe0\xf2\xf3'
>>> print x
Òàòó
>>> x=x.encode(“latin-1”).decode(“cp1251”).encode(“utf-8”)
>>> x
'\xd0\xa2\xd0\xb0\xd1\x82\xd1\x83'
>>> print x
Тату
>>>
всем спасибо.
Офлайн
фтопку такие либы.
Офлайн
фтопку такие таги.
Офлайн