Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 19, 2007 15:10:54

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

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

x - строка в кодировке cp1251 (содержит русский текст)
мне нужно конвертнуть ее в utf-8

x= tag.getArtist()
print type(x), x
x.decode(“cp1251”).encode(“UTF-8”)
print x


вот этот кусочек скрипта вываливает мне ошибки такого вида:

user@host:~/python$ ./test.py test.mp3
<type ‘unicode’> &#210;&#224;&#242;&#243;
Traceback (most recent call last):
File “./test.py”, line 13, in <module>
x.decode(“cp1251”).encode(“UTF-8”)
File “encodings/cp1251.py”, line 15, in decode
UnicodeEncodeError: ‘ascii’ codec can't encode characters in position 0-3: ordinal not in range(128)

В чем тут дело может быть?



Офлайн

#2 Окт. 19, 2007 15:38:05

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

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

у вас строка уже в unicode, не в cp1251. об этом говорит вывод print type(x)

<type ‘unicode’>

декодировать из cp1251 нету никакого смысла. последние 2 строки должны быть:

y = x.encode('utf-8')
print y



Офлайн

#3 Окт. 19, 2007 15:39:46

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

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

У тебя tag.getArtist() уже unicode.
Т.е. хватит x.encode("utf8')



Офлайн

#4 Окт. 19, 2007 16:03:18

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

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

bialix
у вас строка уже в unicode, не в cp1251. об этом говорит вывод print type(x)

<type ‘unicode’>

декодировать из cp1251 нету никакого смысла. последние 2 строки должны быть:

y = x.encode('utf-8')
print y
насколько я понимаю unicode это просто внутренний способ хранения строк в питоне и он может содержать строку в любой кодировке.
чтобы конвертнуть из одной кодировки в другую, питон должен знать исходную кодировку и конечную.

короче, вариант

x= tag.getArtist()

print type(x), x

print x.encode(“utf-8”)



user@host:~/python$ ./test.py test.mp3
<type ‘unicode’> &#210;&#224;&#242;&#243;
&#210;&#224;&#242;&#243;

не конвертит строчку вообще.



Отредактировано (Окт. 19, 2007 17:16:56)

Офлайн

#5 Окт. 19, 2007 16:32:04

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

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

да, забыл сказать. родная кодировка в консоли у меня utf-8



Офлайн

#6 Окт. 19, 2007 16:38:00

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

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

duxa
насколько я понимаю unicode это просто внутренний способ хранения строк в питоне и он может содержать строку в любой кодировке.
чтобы конвертнуть из одной кодировки в другую, питон должен знать исходную кодировку и конечную.
Неправильно понимаешь. Все не так, все совсем наоборот.
Рекомендую изучить матьчасть.



Офлайн

#7 Окт. 19, 2007 17:00:28

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

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

bialix
duxa
насколько я понимаю unicode это просто внутренний способ хранения строк в питоне и он может содержать строку в любой кодировке.
чтобы конвертнуть из одной кодировки в другую, питон должен знать исходную кодировку и конечную.
Неправильно понимаешь. Все не так, все совсем наоборот.
Рекомендую изучить матьчасть.
этим я непременно займусь =)

тем не менее вопрос остается открытым: x.encode(“utf-8”) строку не конвертит.
и я по-прежнему убежден, что для того чтобы конвертнуть строку из одной кодировки в другую необходимо знать начальную кодировку и конечную.
более того, x.encode(“utf-8”) не имеет видимого смысла, так как print x автоматически конвертит строку в кодировку консоли, которая как раз и есть в моем случае utf-8.



Офлайн

#8 Окт. 19, 2007 17:45:43

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

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

а ты попробуй запустить свой скрипт с перенаправлением вывода в файл или через pipe:

user@host:~/python$ ./test.py test.mp3 | less

узнаешь много новых питоновских матюков



Офлайн

#9 Окт. 19, 2007 18:45:29

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

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

bialix
а ты попробуй запустить свой скрипт с перенаправлением вывода в файл или через pipe:

user@host:~/python$ ./test.py test.mp3 | less

узнаешь много новых питоновских матюков
попробовал - ничего нового, да и откуда им взяться?



Офлайн

#10 Окт. 20, 2007 02:19:30

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

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

duxa
x - строка в кодировке cp1251 (содержит русский текст)
мне нужно конвертнуть ее в utf-8
x.decode('cp1251') # декодирует строку из 1251 в юникод
print x # выводит строку
# запущеный в консоли питон сам в состоянии узнать в какой
# кодировке твоя консоль чтобы вывести текст в правильной
# кодировке. если выводить текст не в консоль а например
# в файл то можно сделать чтото вроде
print x.encode('utf8') # тупо отдаст на stdout строку в utf8

почему он выдет ерунду и говорит type ‘unicode’?
скорее всего потому что getArtist возвращает в unicode объекте 1251 строку



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version