Как преобразовать строку из одной кодовой страницы в другую?

Мне нужно преобразовать эту строку во что-то читаемое.

'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'

У него нет метода .decode, только .encode.

Хуже всего то, что я не уверен, что это за кодовая страница. Вероятно, это "cp1251".

Я на Python 3, но ответы на Python 2 также приветствуются. Я не совсем понимаю, что именно было изменено.


person puppon -su    schedule 08.11.2017    source источник
comment
В Python 3 вы можете использовать только .decode() байт.   -  person kichik    schedule 08.11.2017


Ответы (2)


Вероятно, это "cp1251".

Близко... ой.

Поскольку он полон младших суррогатов, мы можем сказать, что он был декодирован с использованием errors='surrogateescape', поэтому сначала нам нужно закодировать его с помощью этого.

>>> 'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'.encode('latin-1', errors='surrogateescape')
b'Old_video/\xc2\xe8\xe4\xe5\xee\xef\xf0\xe8\xea\xee\xeb\xfb'

И теперь, когда у нас есть это, мы можем попытаться расшифровать его правильно.

>>> 'Old_video/\udcc2\udce8\udce4\udce5\udcee\udcef\udcf0\udce8\udcea\udcee\udceb\udcfb'.encode('latin-1', errors='surrogateescape').decode('cp1251')
'Old_video/Видеоприколы'

Если это то, каким должно быть имя файла, то поздравляю, вы угадали правильно.

person Ignacio Vazquez-Abrams    schedule 08.11.2017

В Python 3 вы можете использовать только байты .decode(). — кичик

Правильный. .decode преобразует список байтов в строку. Итак, если у вас есть строка, вы должны сначала преобразовать ее в байты с помощью .encode(), а затем .decode() результата этой операции.

Так, например, если у вас есть текстовая строка utf-8 и вы хотите преобразовать ее в кодовую страницу 1252 (используется в компьютерах Западной Европы),

text = sourcetext.encode('cp1252').decode('utf-8')

В общем, должно быть:

source_codepage = 'utf-8'    # or whatever the current format is
target_codepage = 'cp1252'   # or whatever format you like

newtext = sourcetext.encode(target_codepage).decode(source_codepage)

где source_codepage и target_codepage — две строки, содержащие соответственно название кодировки исходного текста и желаемой.

Полный список строк кодовых страниц, доступных в Python, можно найти здесь: https://docs.python.org/3/library/codecs.html#standard-encodings

person Max1234-ITA    schedule 10.02.2021