Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2007 02:32:32

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

и еще раз кодировки

вот инфа к размышлению

>>> 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
йомайо
у топикстартера примерно такойже глюк



Офлайн

#2 Окт. 20, 2007 06:29:13

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

и еще раз кодировки

redixin, это баг ipython.

duxa, покажи:

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


P.S. Дело, стопудов, не в питоне, а в кривых тегах mp3-файла, в которых вместо latin-1 запихана cp1251, либо либе чтения id3-тегов, которая это не умеет обрабатывать явно.



Офлайн

#3 Окт. 22, 2007 12:11:08

duxa
От:
Зарегистрирован: 2007-10-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

и еще раз кодировки

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?



Офлайн

#4 Окт. 22, 2007 12:14:38

duxa
От:
Зарегистрирован: 2007-10-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

и еще раз кодировки

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>>'



Офлайн

#5 Окт. 22, 2007 12:23:39

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

и еще раз кодировки

x = tag.getArtist()

а не

x = tag.getArtist

разницу видите?



Офлайн

#6 Окт. 22, 2007 12:26:28

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

и еще раз кодировки

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. Аргументом метода выступает желаемая кодировка.



Офлайн

#7 Окт. 22, 2007 12:49:14

duxa
От:
Зарегистрирован: 2007-10-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

и еще раз кодировки

bialix
x = tag.getArtist()

а не

x = tag.getArtist

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

>>> y=tag.getArtist()
>>> repr(y)
“u'\\xd2\\xe0\\xf2\\xf3'”



Офлайн

#8 Окт. 22, 2007 14:06:48

duxa
От:
Зарегистрирован: 2007-10-19
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

и еще раз кодировки

оправдалось предположение о том, что при кодировании в юникод либа для чтения тэгов была уверена что исходная строка в 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
Тату
>>>


всем спасибо.



Офлайн

#9 Окт. 22, 2007 14:11:35

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

и еще раз кодировки

фтопку такие либы.



Офлайн

#10 Окт. 22, 2007 15:00:39

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

и еще раз кодировки

фтопку такие таги.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version