redixin
Окт. 20, 2007 02:32:32
вот инфа к размышлению
>>> 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
йомайо
у топикстартера примерно такойже глюк
j2a
Окт. 20, 2007 06:29:13
redixin, это баг ipython.
duxa, покажи:
>>> x = tag.getArtist()
>>> repr(x)
P.S. Дело, стопудов, не в питоне, а в кривых тегах mp3-файла, в которых вместо latin-1 запихана cp1251, либо либе чтения id3-тегов, которая это не умеет обрабатывать явно.
duxa
Окт. 22, 2007 12:11:08
redixin
duxa
x - строка в кодировке cp1251 (содержит русский текст)
мне нужно конвертнуть ее в utf-8
x.decode('cp1251') # декодирует строку из 1251 в юникод
print x # выводит строку
# запущеный в консоли питон сам в состоянии узнать в какой
# кодировке твоя консоль чтобы вывести текст в правильной
# кодировке. если выводить текст не в консоль а например
# в файл то можно сделать чтото вроде
print x.encode('utf8') # тупо отдаст на stdout строку в utf8
почему он выдет ерунду и говорит type ‘unicode’?
скорее всего потому что getArtist возвращает в unicode объекте 1251 строку
у меня точно такое же впечатление. но как распаковать юникод-объект и получить ‘str’ в чистом виде, чтобы можно было конвертнуть в utf-8?
duxa
Окт. 22, 2007 12:14:38
j2a
redixin, это баг ipython.
duxa, покажи:
>>> x = tag.getArtist()
>>> repr(x)
P.S. Дело, стопудов, не в питоне, а в кривых тегах mp3-файла, в которых вместо latin-1 запихана cp1251, либо либе чтения id3-тегов, которая это не умеет обрабатывать явно.
тэги действительно кривые, в 1251 =)
>>> x=tag.getArtist
>>> repr(x)
'<bound method Tag.getArtist of <eyeD3.tag.Tag instance at 0xb7da8c8c>>'
bialix
Окт. 22, 2007 12:23:39
x = tag.getArtist()
а не
x = tag.getArtist
разницу видите?
bialix
Окт. 22, 2007 12:26:28
duxa
redixin
duxa
x - строка в кодировке cp1251 (содержит русский текст)
мне нужно конвертнуть ее в utf-8
x.decode('cp1251') # декодирует строку из 1251 в юникод
print x # выводит строку
# запущеный в консоли питон сам в состоянии узнать в какой
# кодировке твоя консоль чтобы вывести текст в правильной
# кодировке. если выводить текст не в консоль а например
# в файл то можно сделать чтото вроде
print x.encode('utf8') # тупо отдаст на stdout строку в utf8
почему он выдет ерунду и говорит type ‘unicode’?
скорее всего потому что getArtist возвращает в unicode объекте 1251 строку
у меня точно такое же впечатление. но как распаковать юникод-объект и получить ‘str’ в чистом виде, чтобы можно было конвертнуть в utf-8?
объясняю еще раз: юникод – это представление каждого символа в виде 2х или 4х байт. Там нет понятия кодировки. Поэтому он и называется
юникодом.
Его не “распаковывают” – юникодную строку можно преобразовать в обычную байтовскую строку через метод encode. Аргументом метода выступает желаемая кодировка.
duxa
Окт. 22, 2007 12:49:14
bialix
x = tag.getArtist()
а не
x = tag.getArtist
разницу видите?
пардон, ступор
>>> y=tag.getArtist()
>>> repr(y)
“u'\\xd2\\xe0\\xf2\\xf3'”
duxa
Окт. 22, 2007 14:06:48
оправдалось предположение о том, что при кодировании в юникод либа для чтения тэгов была уверена что исходная строка в 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
Тату
>>>
всем спасибо.