这是什么编码,如何在Python中解码?

时间:2018-10-21 08:53:36

标签: python python-3.x unicode

我有一个包含%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的{​​{1}}来对此进行解码。该工具已正确将此输入解码为\xed\xa1\x85\xed\xb7\x97.svg

这里会发生什么?

1 个答案:

答案 0 :(得分:3)

您需要正确的编码才能使命令行控制台/终端(支持utf-8并配置为utf-8)显示正确的字符

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
PEP 263 -- Defining Python Source Code Encodings: https://www.python.org/dev/peps/pep-0263/
https://stackoverflow.com/questions/3883573/encoding-error-in-python-with-chinese-characters#3888653
"""
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)
  

#怼呿窏
     #瞴�窾�
     #怼呿窏

这是一个非常奇特的unicode字符,我对编码是错误的,它不是简体中文字符,它是传统字符,并且在映射中也很远\U215D7-CJK UNIFIED IDEOGRAPHS EXTENSION B
但是列出的代码点和其他值使我怀疑这是编码不良的代码,所以花了我一段时间。
有人帮我弄清楚了编码是如何变成这种形式的。您需要进行一些编码转换才能将其恢复为原始值。

cjk = unquote_to_bytes(urlencoded).decode('utf-8', 'surrogatepass').encode('utf-16', 'surrogatepass').decode('utf-16')
print(cjk)