目 录CONTENT

文章目录

【Python】常见编码处理

EulerBlind
2025-07-01 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

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

点击并拖拽以移动

0

评论区