我最近在我的 Win11 64位电脑上使用python3编码解码出现几个莫名其妙的问题, 我解决问题之后,写下文章,方便python的初学者。
零,为什么要编码和解码
在计算机系统中,字符通常以二进制编码形式存储和传输。而不同的字符编码标准使用不同的编码方式来将字符映射为二进制数据。在处理文本数据时,需要将字符转换为对应的二进制数据进行存储和传输,同时也需要将接收到的二进制数据转换回字符形式进行使用。这个过程就是编码和解码。
具体来说,编码是将字符转换为对应的二进制数据的过程。例如,将字符“a”转换为ASCII编码中对应的二进制数值97,将字符“中”转换为UTF-8编码中对应的三个字节的二进制数据。进行编码后,字符就可以以二进制数据的形式进行存储和传输。
解码则是将二进制数据转换为对应的字符形式的过程。例如,将ASCII编码中的二进制数值97转换为字符“a”,将UTF-8编码中的三个字节的二进制数据转换为字符“中”。进行解码后,就可以使用相应的字符了。
编码和解码的作用就是在不同的字符编码标准之间进行转换,以实现字符的存储、传输和使用。在处理文本数据时,由于不同的字符编码标准的存在,在进行编码和解码时需要注意选择正确的编码方式,否则可能会导致乱码、字符丢失等问题。
要点总结(重要理解
1,编码和解码是处理字符与二进制数据之间转换的过程。
2,编码将字符转换为二进制数据,而解码则将二进制数据转换回字符形式。
3,这些过程在计算机系统中用于存储、传输和使用文本数据。
4,字符编码标准如Unicode定义了字符与二进制数据之间的对应关系。
5,不同的编码方式使用不同的规则进行转换。
6,正确的编码和解码选择是保证文本数据正确性的重要因素。
一,编码(encoding)和解码(decoding)方法
在Python中,可以使用编码(encoding)和解码(decoding)方法来处理字符串的转换。编码是将字符串转换为字节序列的过程,而解码则是将字节序列转换回字符串的过程。
在Python中,常用的编码方式有ASCII、UTF-8和UTF-16等。其中,ASCII是最基本的字符编码方式,只能表示英文字母、数字和一些特殊字符;而UTF-8是一种可变长度的Unicode编码方式,可以表示几乎所有的字符。
Unicode的知识补充:
Unicode(统一码、万国码、国际码)是一种字符编码标准,它为世界上几乎所有的字符(包括字母、数字、标点符号、符号、表情符号等)定义了唯一的标识符。Unicode旨在解决不同国家和地区使用不同字符集的问题,通过统一编码方案,实现了全球范围内的字符标准化。
Unicode使用16位或32位的代码单元来表示一个字符,每个字符都对应着一个唯一的Unicode码点(code point)。Unicode码点以U+开头,后面跟着一到六位十六进制数字,例如U+0041代表字符"A",U+4E2D代表字符"中"。
对于比较常见的字符,Unicode采用和ASCII编码兼容的方式,使得ASCII字符在Unicode中依然保持相同的编码。这意味着,使用Unicode编码的文本可以同时包含ASCII字符和其他语言字符,从而实现了多语言的混排和混写。
Unicode编码方案有多种实现方式,常见的有UTF-8、UTF-16和UTF-32等。其中,UTF-8是最常用的一种编码方式,它使用变长的字节序列来表示Unicode字符,对于ASCII字符只需要一个字节,而其他字符需要更多的字节表示。
总结起来,Unicode是一种全球字符编码标准,为世界上几乎所有的字符定义了唯一的标识符,通过统一的编码方案,解决了不同字符集的兼容性问题,实现了多语言字符的统一表示。
二,常用的编码和解码方法的示例
1.编码:
使用字符串对象的 encode()
方法进行编码,可以指定编码方式,默认为UTF-8编码。
string = "Hello, 世界!"
encoded_string = string.encode() # 默认使用UTF-8编码
print(encoded_string)
# 结果为:b'Hello, \xe4\xb8\x96\xe7\x95\x8c!'
2.解码
使用字节对象的 decode()
方法进行解码,同样可以指定解码方式,默认为UTF-8解码。
byte_string = b'Hello, \xe4\xb8\x96\xe7\x95\x8c!'
decoded_string = byte_string.decode() # 默认使用UTF-8解码
print(decoded_string)
# 结果为:Hello, 世界!
注意:在解码时,要确保使用与编码时相同的编码方式,否则可能会导致解码错误。
其他常用方式:
使用Python中的内置模块对文本进行编码和解码
1.ASCII编码与解码:
# ASCII编码
text = "Hello"
encoded_text = text.encode("ascii")
print(encoded_text) # b'Hello'
# ASCII解码
decoded_text = encoded_text.decode("ascii")
print(decoded_text) # Hello
2.URL编码与解码(使用urllib.parse模块):
import urllib.parse
# URL编码
url = "https://www.example.com/搜索?关键词=中文"
encoded_url = urllib.parse.quote(url)
print(encoded_url)
# https%3A//www.example.com/%E6%90%9C%E7%B4%A2%3F%E5%85%B3%E9%94%AE%E8%AF%8D%3D%E4%B8%AD%E6%96%87
# URL解码
decoded_url = urllib.parse.unquote(encoded_url)
print(decoded_url) # https://www.example.com/搜索?关键词=中文
3.Base64编码与解码(使用base64模块):
import base64
# Base64编码
text = "Hello World!"
encoded_text = base64.b64encode(text.encode("utf-8"))
print(encoded_text) # b'SGVsbG8gV29ybGQh'
# Base64解码
decoded_text = base64.b64decode(encoded_text).decode("utf-8")
print(decoded_text) # Hello World!