Python 3 字符处理攻略

正文索引 [隐藏]

偶对,这个和字符编码息息相关,由于 python 2 蛋疼的编码,选择 python 3 作为总结对象。

传送门:恼人的 python 编码

1. str => byte

首先得要确定编码形式,python3 中的 string 指的是 Unicode 编码,所以没有办法显示出二进制流的,需要使用encode()函数指定编码将 str 类型转换为 byte 类型,测试代码:

s = 'abc中国'
s_utf8 = s.encode('utf-8')
s_gbk = s.encode('gbk')
print(s)
print(s_utf8)
print(s_gbk)

1565835938630

注意一下,英文字母不会显示出十六进制的数,会直接显示出可读的亚子~

2. 读取 byte 类中的值

那么此时在 byte 类型的串中,数据的类型到底是什么呢?用迭代器取出来看一看,emmm,每次都能取出字符对应的字节(英文 1 byte,中文 2 bytes)的十进制 int 值,很方便哇,轻松实现 byte to int 的需求:

1565836305677

那么如果想要将一个 int 写出来转化为 byte 进而解码成 string 怎么做呢?

3. int 数据 => str

bytes()

只有英文的情况下用的方法是使用 bytes 函数,小心,bytes 这个函数处理 int to byte 的时候需要的是 list ,如果只传一个 int 进去,它就会生成一个传入整数那么多的空白字节流~:

x = 97
print(type(x))

y = bytes(x)
print(y)

y = bytes([x,])
print (y)

z = y.decode('utf-8')
print(z)

1565837370121

ord() & chr()

这对组合不管编码的问题,直接对准 Unicode

print(ord('e')) # ord() 返回单个字符的 Unicode 值
print(chr(99)) # chr() 返回 int 参数 Unicode 下对应的字符值

1565918470408

附:进制转化

上面取出的十进制 int 值看起来可能不是那么顺眼,可能更希望转化为 8 进制、十六进制这种玩意儿,那就继续折腾叭:

a = 16
b = hex(a)
print("b 的值: " + str(b) + "\tb 的type: " + str(type(b)))

1565838587222

可见 python3 对于进制的处理就是:十进制为 int ,其他进制均为 str,因此,如果想要将十六进制转化为二进制啊八进制啊的,就得先转为十进制的 int 类型,然后再转,基本思路如下:

1565882214712

常用进制转化函数:

x = 16

x_hex = hex(x) # 十进制转十六进制
x_binary = bin(x) # 十进制转二进制
x_octonary = oct(x) # 十进制转八进制

x = int(x_hex, 16) # 十六进制转十进制
x = int(x_binary, 2) # 二进制转十进制
x = int(x_octonary, 8) # 八进制转十进制