Найти - Пользователи
Полная версия: Как декодировать строку? (HElp please)
Начало » Python для новичков » Как декодировать строку? (HElp please)
1 2 3
Silen
Посоветуйте PLZ как декодировать строку содержащую коды unicode?

x= ‘\u0418\u0433\u0440\u0430 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435’
print x.?(“utf-8”)
Piton23
encode()/decode()
Silen
Piton23
encode()/decode()
А конкретнее?

Скрипт:
x= '\u0418\u0433\u0440\u0430 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435'
print x.encode("utf-8")
print x.decode("utf-8")
Результат:
>>> 
\u0418\u0433\u0440\u0430 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435
\u0418\u0433\u0440\u0430 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435
kmike
Это строка не в utf8, а в кодировке unicode-escape (откуда она такая взялась, кстати?)

>>> x= '\u0418\u0433\u0440\u0430 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435'
>>> x
'\\u0418\\u0433\\u0440\\u0430 \\u043d\\u0430 \\u0432\\u044b\\u0436\\u0438\\u0432\\u0430\\u043d\\u0438\\u0435'
>>> x.decode('unicode-escape')
u'\u0418\u0433\u0440\u0430 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435'
>>> print x.decode('unicode-escape')
Игра на выживание
>>>
Piton23
“А конкретнее?” А поэкспериментировать? )
Тут много вопросов, какая ось, откуда запускаете в idle или отдельным файлом в косоли. В win там замудренно все с кодировками (т.е. в консоли одна в файлах другая, смотря какую строку кодировки в начале файла укажешь) но решаемо

так то если строка в utf-8 и надо превратить в последовательность байтов (внутренняя структура питона вроде unicode) то нужно decode('utf')
если из последовательности байт в строку с кодировкой cp1251 то encode('cp1251')
Вроде ниче не напутал
kmike
Piton23
так то если строка в utf-8 и надо превратить в последовательность байтов (внутренняя структура питона вроде unicode) то нужно decode('utf')
Строка в utf8 - это уже *последовательность байтов*. Это такая последовательность байтов, которую можно декодировать в символы юникода (в буквы, в текст) с помощью кодировки (==алгоритма) utf8.

Piton23
если из последовательности байт в строку с кодировкой cp1251 то encode('cp1251')
Из последовательности байт в строку в кодировке cp1251 (т.е. другую последовательность байт) нельзя получить, не зная кодировку исходной последовательности байт. Например, если нужно переконвертировать utf8-строку в 1251-строку, мы сначала декодируем utf8 в юникод, а потом кодируем юникод в 1251.
Piton23
Ну немного ошибся в формулировке, не последовательность байт а юникод. Но суть то не изменилась, надо преобразовать ИЗ кодировки я пишу decode(), надо преобразовать В кодировку я пишу encode(), надо преобразовать ИЗ В пишу decode().encode(). Так что не придирайся :) я уже не мало дней потратил на их разбирательство.
Silen
kmike
Это строка не в utf8, а в кодировке unicode-escape (откуда она такая взялась, кстати?)
Спасибо! Все заработало :) Взялась с белорусского медиа портала - API у них такое.
maxfox
Помогите, пожалуйста! Аналогичный вопрос, но ничего из описанного здесь не помогло. И поиск в гугле тоже.
Есть файл https://www.dropbox.com/s/ndtiyckowp81hsi/example.txt
Содержимое файла:
\\u0410\\u043b\\u0435\\u043a\\u0441\\u0430\\u043d\\u0434\\u0440
decode('unicode_escape') выдает то же самое, только на один слэш меньше в каждом символе.

Надо привести файл в читабельный вид. Совершенно не представляю, что делать.
Windows, Python 2.7.

PS
Python 2.7.6 (default, Nov 10 2013, 19:24:24) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x='\\u0410\\u043b\\u0435\\u043a\\u0441\\u0430\\u043d\\u0434\\u0440'
>>> print x.decode('unicode-escape')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-8: character maps to <undefined>
TroSer
decode('unicode_escape') выдает то же самое, только на один слэш меньше в каждом символе.

у меня ваш пример запустился, строку “Александр” печатает
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