当前位置:   article > 正文

Python 中的字符串、字节串和字符编码utf-8(个人笔记)_python 字符串utf8编码

python 字符串utf8编码

Python 中的字符串、字节串和字符编码utf-8(个人笔记)

前言

我们在写python脚本时,经常能看到 utf-8 ,那这个 utf-8到底是干嘛的呢?

除了 utf-8 还有哪些常用的编码?

UTF-8

UTF-8 英文全称为 Unicode Transformation Format 8 Bits

其中 Unicode 也是缩写, 英文全称为 Universal encoding 通用编码

Unicode 提供的编码方案和 ASCII表格类似,但是相对而言庞大得多。

你可以用32位去编码一个 Unicode 字符,这对我们能找到的所有语言都够了。但是太浪费了,不是吗?

UTF - 8 就是一种巧妙的解决方案,

UTF-8 :一个编码约定,就是一种压缩编码的方式,针对常见字符使用8位,需要的时候再去使用 16位 或者 32 位。


补充

unicode 出现了,很好,但是还有一个问题。 字符怎么存储和传输。

由于历史原因,计算机是 以字节为单位 来 存储和传输数据的,一个字节 由 8位二进制数字表示,最多可以表示从0到255, 一共256个字符。

最初只有ASCII码的时候,一个字节 就可以存储传输任何文字。

但是unicode里面有10多万的文字符号,数字范围 远远 超过 一个字节所能代表的数字。

所以一个字节不够。

那么怎么用多个字节来 表示这些数字呢?

这就有需要另外的规范。这些 如何用字节表示 字符对应的数字 就是 字符编码 规范

unicode字符 的编码,最常用的规范是 UTF8 和 UTF16

比如 UTF8 表示 中文字符 ,就是用 3个字节表示的,对应的16进制表示是 E4 、BD、 A0

当然我们中文字符集gb(国标)系列使用另外的编码规范。

字符串编码

Python语言要对字符串对象 进行存储和传输的时候,是不能直接传输的,必须要先编码

通常要使用字符串的encode方法,参数指定编码方式,编码为一个 bytes 对象。

bytes对象的底层就是用一个个的字节来存储字符串中的文字的。

同样的字符串,用不同的编码方式,有时会产生不同的bytes结果。

比如

print ('你好'.encode('utf8'))  
print ('你好'.encode('gbk'))   
  • 1
  • 2

在这里插入图片描述

输出内容 中 b 开头,表示这是一个 字节串bytes 对象

\x 说明是用 16进制 表示一个字节(2个 16进制 是一个字节)

你好 两个字,使用 utf8 编码 后的字节串,用16进制来表示 就是6个字节 e4bda0 e5a5bd

e4bda0 对应 你
e5a5bd 对应 好
  • 1
  • 2

你好 两个字,使用 gbk 编码 后的字节串,用16进制来表示 却是4个字节 c4e3 bac3

c4e3 对应 你
bac3 对应 好
  • 1
  • 2

encode方法返回的是 编码后的字节串对象bytes ,编码为字节串对象 bytes 就可存储到文件或者传输到网络中去了。

字节串解码

当我们的Python程序从文件中读入文字信息, 从网络上接收 文字信息,获取的数据通常是使用某种字符编码后的 字节串。

程序通常需要解码这些 字节串字符串 ,这样才方便程序 理解和处理 字符信息。

Python语言的解码 都是解码成 unicode字符串对象。

要解码字节串,必须要知道这个字节串是用什么字符编码的方式进行编码的。

如果知道了,就可以用字节串对象的decode方法 进行解码,参数指定了编码方式

比如

print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf8'))
print(b'\xc4\xe3\xba\xc3'.decode('gbk'))
  • 1
  • 2

在这里插入图片描述

上面的两行代码都可以解码出 字符串 ‘你好’

如果不小心写错了参数指定的编码方式,就可能返回错误解码结果 , 比如

print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('gbk'))
返回 浣犲ソ
  • 1
  • 2

或者解码失败报错,比如

print(b'\xc4\xe3\xba\xc3'.decode('utf8'))

报如下错误:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation b
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

一些字符编解码技巧

unicode数字转换为字符

把 unicode数字转换为字符, 使用函数 chr() , 比如:

>>> chr(50)
'2'
>>> chr(20013)
'中'
>>> chr(0x4e2d)  # 0x开头表示数字是16进制
'中'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

字符转换为unicode数字

反过来,要把 字符转换为对应的unicode数字,使用函数 ord()

该函数参数字符串里面只能有一个字符

>>> ord('2')
50
>>> ord('中')
20013
  • 1
  • 2
  • 3
  • 4

字符串编码为 unicode转义数字

除了utf8,gbk 还有一种常见的编码方式,叫做 unicode-escape ,就是直接用unicode数字字符串表示字符,如下所示

>>> '力矩'.encode('unicode-escape')
b'\\u529b\\u77e9'
  • 1
  • 2

用unicode转义数字 写字符串

>>> b'\\u529b\\u77e9'
'力矩'
  • 1
  • 2

直接用16进制数字创建 bytes

>>> b'\xc1\xa6\xbe\xd8'
b'\xc1\xa6\xbe\xd8'

>>> b'\xc1\xa6\xbe\xd8'.decode('gbk')
'力矩'
  • 1
  • 2
  • 3
  • 4
  • 5

字节串 和 16进制表示字节的字符串

>>> a = b'hello,123'
>>> a.hex()
'68656c6c6f2c313233'
  • 1
  • 2
  • 3

反向操作,把 16进制表示字节的字符串 转化为 字节串就是

>>> bytes.fromhex('68656c6c6f2c313233')
b'hello,123'
  • 1
  • 2

总结

简单的说

# 解码
strings = bytes.decode()

# 编码
bytes = str.encode()
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/678835
推荐阅读
相关标签
  

闽ICP备14008679号