Что это за кодировка и как я могу ее декодировать в Python? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть имя файла, содержащее %ed%a1%85%ed%b7%97.svg, и я хочу декодировать его в правильное строковое представление в Python 3. Я знаю, что результатом будет ?.svg, но следующий код не работает:

import urllib.parse
import codecs

input = '%ed%a1%85%ed%b7%97.svg'
unescaped = urllib.parse.unquote(input)
raw_bytes = bytes(unescaped, "utf-8")
decoded = codecs.escape_decode(raw_bytes)[0].decode("utf-8")
print(decoded)

напечатает ������.svg.Однако это работает, когда input - это строка типа %e8%b7%af.svg, для которой она будет правильно декодироваться до 路.svg.

Я пытался расшифровать ее с помощью онлайн-инструментов, таких как https://mothereff.in/utf-8, заменив % на \x, что приведет к \xed\xa1\x85\xed\xb7\x97.svg.Инструмент правильно расшифровал этот ввод в ?.svg.

Что здесь происходит?

1 Ответ

0 голосов
/ 21 октября 2018

вам нужна правильная кодировка для получения консоли / терминала командной строки (которая поддерживает и настроена для utf-8) для отображения правильных символов

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
PEP 263 -- Defining Python Source Code Encodings: https://www.python.org/dev/peps/pep-0263/
/3782668/oshibka-kodirovaniya-v-python-s-kitaiskimi-ieroglifami#3782687
"""
from urllib.parse import unquote

urlencoded = '%ed%a1%85%ed%b7%97'

char = unquote(urlencoded, encoding='gbk')
char1 = unquote(urlencoded, encoding='big5_hkscs')
char2 = unquote(urlencoded, encoding='gb18030')

print(char)
print(char1)
print(char2)

# 怼 呿 窏
#100 � 窾 �
# 怼 呿 窏

это довольно экзотический символ юникода, и я ошибся в кодировке, это не упрощенный китайский символ, это традиционный и довольнотакже далеко в отображении \U215D7 - CJK UNIFIED IDEOGRAPHS EXTENSION B .
, но перечисленная кодовая точка и другие значения вызывали у меня подозрение, что это был плохо закодированный код, поэтому мне потребовалось некоторое время.
кто-то помог мне понять, как кодировка попала в эту форму.вам нужно выполнить несколько преобразований кодирования, чтобы вернуть его к исходному значению.

cjk = unquote_to_bytes(urlencoded).decode('utf-8', 'surrogatepass').encode('utf-16', 'surrogatepass').decode('utf-16')
print(cjk) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...