python3字符串编码总结-str(unicode)_bytes

本文介绍了Python3中字符串和字节码的基本概念及其相互转换方法。重点讲述了Python3默认使用的str类型及其unicode编码,以及bytes类型在文件操作和网络通信中的应用。此外,还详细解释了ascii、unicode及utf-8等编码格式的区别与联系。

概述:python3中默认对字符串采用的是unicode编码的str类型来表示,任一字符用两字节表示。而bytes类型,其本质是比特流,即"10110011 00110011 xxxxxxxx",bytes表示的比特流是什么含义由不同的编码格式确定,比如如果是ascii编码,那么每8位表示一个字符。python3在进行文件操作和网络通信都是使用bytes进行的,所以对于str类型要进行编码后才能写入文件或网络。
(想进一步详细了解的各位可以继续阅读下面内容)。

1. 字符串的编码形式

字符串的编码最一开始是ascii,使用8位二进制表示,因为英文就是编码的全部。后来其他国家的语言加入进来,ascii就不够用了,所以一种万国码就出现了,它的名字就叫unicode,unicode编码对所有语言使用两个字节,部分汉语使用三个字节。但是这就导致一个问题,就是unicode不仅不兼容ascii编码,而且会造成空间的浪费,于是uft-8编码应运而生了,utf-8编码对英文使用一个字节的编码,由于这样的特点,很快得到全面的使用。

2. 字节码bytes

python3中bytes用b’xxx’表示,其中的x可以用字符,也可以用ascii表示。python3中的二进制文件(如文本文件)统一采用字节码读写

2.1. 字节码的使用举例

这里写图片描述

2.2. 字节码的修改

要修改bytes中的某一个字节必须要将其转换为bytearray以后才可以。如下:

这里写图片描述

2.3. 字节码bytes与字符之间的关系

将表示二进制的bytes进行适当编码就可以变为字符了,比如utf-8或是gbk等等编码格式都可以。(所以我个人的理解就是:有utf-8格式的bytes,也有gbk格式的bytes等等)。

2.4. 字节码bytes与unicode编码的相互转换
这一部分非常重要,所以放在后面具体讲。

3. python3的编码

3.1 python2与python3字符串编码的区别

python3默认使用的是str类型对字符串编码,默认使用bytes操作二进制数据流,两者不能混淆!!
Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。Python2也有两种表示字符序列的类型,分别叫做str和Unicode,与Python3不同的是,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。

3.2 bytes与str类型的相互转换

str(unicode)类型是基准!要将str类型转化为bytes类型,使用encode()内置函数;反过来,使用decode()函数。使用实例如下:

>>>oath = ‘我爱妞’
>>>type(oath)
<class 'str'>
>>>oath = oath.encode(‘utf-8’)
>>> type(oath)
<class 'bytes'>
>>> oath
b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa6\x9e'
>>> oath = oath.decode()
>>> oath
'我爱妞'

为了方便开发者的使用,可以编写两个helper函数,第一个是无论输入的是str还是bytes类型都输出str。

def to_str(bytes_or_str):
  if isinstance(bytes_or_str, bytes):
    value = bytes_or_str.decode('utf-8')
  else:
    value = bytes_or_str
  return value # Instance of str

另外,还需要编写接受str或bytes,并总是返回bytes的方法:

def to_bytes(bytes_or_str):
  if isinstance(bytes_or_str, str):
    value = bytes_or_str.encode('utf-8)
  else:
    value = bytes_or_str
  return value # Instance of bytes

3.3 文件的编码

with open(‘sun.bin’,’wb’) as f:
	f.write(b‘sui’)

在open文件的时候用“wb”方式打开,即二进制写的方式,所以下面的write函数对象用的是bytes类型的b’sui’,这个时候如果使用f.write(‘sui’)就会出错的。
(注:对打开文件的路径的操作,使用os模块的getcwd方法以及chdir方法)

3.4 网页的编码

>>>import urllib.request
>>>response = urllib.request.urlopen(‘http://www.baidu.com’)
>>>html = response.read()
>>>type(html)
<class 'bytes'>

所以要正常显示的话,就要使用decode()方法了。

### ASCII、UTF-8、字节、十六进制和二进制的关系与区别 ASCII 是最早的字符编码标准,它使用 7 位二进制数表示 128 个字符,包括英文字母、数字和一些控制字符。每个 ASCII 字符占用 1 个字节(8 位),其中最高位始终为 0,因此 ASCII 编码范围是 0x00 到 0x7F(即十进制的 0 到 127)[^1]。 Unicode 是一个更大的字符集,旨在涵盖全球所有语言的字符。它定义了每个字符的唯一编号(称为码点),但没有规定如何将这些码点存储为字节。UTF-8 是 Unicode 的一种变长编码方式,能够以 1 到 4 个字节表示所有 Unicode 字符。对于 ASCII 字符集中的字符,UTF-8 使用单个字节进行编码,且与 ASCII 完全兼容;而对于其他字符,则使用多字节序列进行编码[^3]。 字节(Byte)是计算机中存储数据的基本单位,通常由 8 位(bit)组成。在不同的编码方式下,一个字符可能需要占用不同数量的字节。例如,在 ASCII 中,每个字符占用 1 个字节;而在 UTF-8 中,中文字符通常占用 3 个字节。字节可以用十六进制表示,例如 `0xE7` 表示一个字节,其二进制形式为 `11100111`。因此,字节、十六进制和二进制之间可以直接相互转换[^4]。 十六进制(Hexadecimal)是一种基数为 16 的计数系统,常用于表示二进制数据。每个十六进制数代表 4 位二进制数(即一个 nibble),两个十六进制数可以表示一个完整的字节(8 位)。例如,十六进制数 `0xE7` 对应的二进制数为 `11100111`。在 UTF-8 编码中,中文字符通常以三个字节的形式表示,每个字节可以转换为两个十六进制数[^4]。 二进制(Binary)是计算机中最基本的数据表示形式,由 0 和 1 组成。所有字符在计算机内部都以二进制形式存储。ASCII 字符使用 7 位二进制数表示,而 UTF-8 编码则使用可变长度的二进制序列来表示 Unicode 码点。例如,中文字符“编”在 UTF-8 编码下的二进制表示为 `11100111 10111100 10110001`,对应的十六进制为 `E7 BC B1`[^1]。 ### 示例代码:查看字符的 UTF-8 编码 ```python s = "编" utf8_bytes = s.encode(&#39;utf-8&#39;) print("UTF-8 编码(十六进制):", utf8_bytes.hex()) print("UTF-8 编码(二进制):", &#39; &#39;.join(f"{byte:08b}" for byte in utf8_bytes)) ``` 输出结果: ``` UTF-8 编码(十六进制): e7bcc1 UTF-8 编码(二进制): 11100111 10111100 10110001 ``` ### 总结 - **ASCII** 是最早的字符编码标准,仅支持 128 个字符,每个字符占用 1 个字节。 - **Unicode** 是一个字符集,定义了全球所有字符的唯一编号(码点),但未规定如何存储。 - **UTF-8** 是 Unicode 的一种实现方式,使用 1 到 4 个字节表示字符,兼容 ASCII。 - **字节** 是计算机存储的基本单位,通常由 8 位组成。 - **十六进制** 是一种常用的表示字节的方式,每个十六进制数代表 4 位二进制数。 - **二进制** 是计算机中最基本的数据表示形式,由 0 和 1 组成。 ###
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值