Найти - Пользователи
Полная версия: и еще раз кодировки
Начало » Python для новичков » и еще раз кодировки
1 2 3
redixin
вот инфа к размышлению
>>> 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
redixin, это баг ipython.

duxa, покажи:

>>> x = tag.getArtist()
>>> repr(x)


P.S. Дело, стопудов, не в питоне, а в кривых тегах mp3-файла, в которых вместо latin-1 запихана cp1251, либо либе чтения id3-тегов, которая это не умеет обрабатывать явно.
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?
duxa
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
x = tag.getArtist()

а не

x = tag.getArtist

разницу видите?
bialix
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
bialix
x = tag.getArtist()

а не

x = tag.getArtist

разницу видите?
пардон, ступор

>>> y=tag.getArtist()
>>> repr(y)
“u'\\xd2\\xe0\\xf2\\xf3'”
duxa
оправдалось предположение о том, что при кодировании в юникод либа для чтения тэгов была уверена что исходная строка в latin-1 а не в cp1251

поэтому обратная последовательность действий привела к ожидаемому результату:

>>> import eyeD3
>>> tag=eyeD3.Tag()
>>> tag.link(“test.mp3”)
1
>>> x=tag.getArtist()
>>> x
u'\xd2\xe0\xf2\xf3'
>>> print x
&#210;&#224;&#242;&#243;
>>> x=x.encode(“latin-1”).decode(“cp1251”).encode(“utf-8”)
>>> x
'\xd0\xa2\xd0\xb0\xd1\x82\xd1\x83'
>>> print x
Тату
>>>


всем спасибо.
bialix
фтопку такие либы.
j2a
фтопку такие таги.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB