目录

0x00 背景

0x10 Unicode编码(\u字符串)

0x11 源字符串样式

0x12 产生方式

0x13 解码方式

0x20 Hex编码(\x字符串)

0x21 源字符串格式

0x22 产生方式

0x23 解码方式

0x30 十六进制编码

0x31 源字符串格式

0x32产生方式

0x33 解码方式

0x40 Base64编码

0x41 源字符串格式

0x42 产生方式

0x43 解码方式

0x50 Base64编码

0x51 源字符串格式

0x52 产生方式

0x53 解码方式

0x60 编码检测工具(chardet)

0x61 编码检测工具实例


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'}
Logo

GitCode AI社区是一款由 GitCode 团队打造的智能助手,AI大模型社区、提供国内外头部大模型及数据集服务。

更多推荐