我有一个包含%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
。
这里会发生什么?
答案 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)