Найти - Пользователи
Полная версия: и еще раз кодировки
Начало » Python для новичков » и еще раз кодировки
1 2 3
duxa
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)

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

<type ‘unicode’>

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

y = x.encode('utf-8')
print y
Андрей Светлов
У тебя tag.getArtist() уже unicode.
Т.е. хватит x.encode("utf8')
duxa
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;

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

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

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

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

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

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

почему он выдет ерунду и говорит type ‘unicode’?
скорее всего потому что getArtist возвращает в unicode объекте 1251 строку
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