【Python】常见编码处理

目录

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'}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值