目录
0x00 背景
在日常工作中,经常会涉及到一些奇奇怪怪的编码后的内容,无法直接阅读其中的内容,需要使用一些工具对其进行反编码才能得到结果。这里使用python 汇总常见的编码、解码方案。
0x10 Unicode编码(\u字符串)
Unicode编码字符串在Python中相对比较常见,由于Python3及其之后的版本默认使用该编码形式,对于这种类型是最好处理的。
0x11 源字符串样式
s = '\u4f60\u597d'
0x12 产生方式
import json
print(json.dumps('Unicode编码测试'))
>>> Unicode\u7f16\u7801\u6d4b\u8bd5
# 直接json.dumps('Unicode编码测试'),可能得到如下带转意结果
json.dumps('Unicode编码测试')
>>> '"Unicode\\u7f16\\u7801\\u6d4b\\u8bd5"'
0x13 解码方式
对于这种类型只需要直接输出就可得到解码后的内容
# 如下方式都可解码
s # 直接输出
str(s)
repr(s)
0x20 Hex编码(\x字符串)
0x21 源字符串格式
s = "\xe7\xbc\x96\xe7\xa0\x81"
0x22 产生方式
相同的字符串通过不同的编码方式后,得到的结果不同
'Hex编码'.encode('utf-8')
>>> b'Hex\xe7\xbc\x96\xe7\xa0\x81'
'Hex编码'.encode('gbk')
>>> b'Hex\xb1\xe0\xc2\xeb'
0x23 解码方式
由于源字符串可能是通过不同的编码方式得到的,所以在decode 的时候,不一定能得到一个明确的结果,需要使用不同的编码进行尝试
s = "\xe7\xbc\x96\xe7\xa0\x81"
s.encode('raw_unicode_escape').decode('utf-8')
>>> '编码'
s.encode('raw_unicode_escape').decode('gbk')
>>> '缂栫爜'
s = "\xc7\xeb\xb5\xc7\xc2\xbcexmail.qq.com\xd0\xde\xb8\xc4\xc3\xdc\xc2\xeb"
# 注意,在python中如果这种字符串格式不对会提示 SyntaxError
hs.encode('raw_unicode_escape').decode('gbk')
>>> '请登录exmail.qq.com修改密码'
# 对于 bytes 有更简洁方法如下
bs = b'\xc7\xeb\xb5\xc7\xc2\xbcexmail.qq.com\xd0\xde\xb8\xc4\xc3\xdc\xc2\xeb'
bs.decode('gbk')
>>> '请登录exmail.qq.com修改密码'
0x30 十六进制编码
0x31 源字符串格式
s = 'E58D81E585ADE8BF9BE588B6E7BC96E7A081'
0x32产生方式
import base64
base64.b16encode('十六进制编码'.encode())
>>> b'E58D81E585ADE8BF9BE588B6E7BC96E7A081'
import binascii
binascii.b2a_hex('十六进制编码'.encode())
>>> b'e58d81e585ade8bf9be588b6e7bc96e7a081'
0x33 解码方式
import base64
s = "E58D81E585ADE8BF9BE588B6E7BC96E7A081"
base64.b16decode(s)
>>> b'\xe5\x8d\x81\xe5\x85\xad\xe8\xbf\x9b\xe5\x88\xb6\xe7\xbc\x96\xe7\xa0\x81'
base64.b16decode(s).decode()
>>> '十六进制编码'
import binascii
binascii.a2b_hex(s).decode()
>>> '十六进制编码'
0x40 Base64编码
0x41 源字符串格式
s = 'QmFzZTY057yW56CB'
0x42 产生方式
import base64
s = "Base64编码"
base64.b64encode(a.encode())
>>> b'QmFzZTY057yW56CB'
0x43 解码方式
s = 'QmFzZTY057yW56CB'
base64.b64decode(s).decode()
>>> 'Base64编码'
0x50 Base64编码
0x51 源字符串格式
s = '%28URL%E5%AD%97%E7%AC%A6%E4%B8%B2%29'
0x52 产生方式
from urllib.parse import quote
s = "(URL字符串)"
quote(s)
>>> '%28URL%E5%AD%97%E7%AC%A6%E4%B8%B2%29'
0x53 解码方式
from urllib.parse import unquote
s = '%28URL%E5%AD%97%E7%AC%A6%E4%B8%B2%29'
unquote(s)
>>> '(URL字符串)'
0x60 编码检测工具(chardet)
0x61 编码检测工具实例
# pip install chardet
import chardet
s = '编码字符串'.encode()
print(s)
>>> b'\xe7\xbc\x96\xe7\xa0\x81\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
chardet.detect(s)
>>> {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
s = b'\u4f60\u597d'
chardet.detect(s)
>>> {'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
s = b'\xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd'
chardet.detect(s)
>>> {'encoding': 'utf-8', 'confidence': 0.87625, 'language': ''}
s = b'\xc4\xe3\xba\xc3'
chardet.detect(s)
>>> {'encoding': 'TIS-620', 'confidence': 0.44977651504520433, 'language': 'Thai'}