Python学习第四天之字符串的编码和解码

柳三千

前言

1. **跨系统和平台通信的需求**   - 在计算机系统中,不同的操作系统、软件应用程序和网络协议可能使用不同的字符表示方式。例如,在Windows系统和Linux系统之间传输文本数据时,它们内部对字符的存储和处理方式可能有所不同。如果没有统一的编码和解码机制,当文本从一个系统传输到另一个系统时,就会出现字符乱码的情况。   - 以网络通信为例,当浏览器向服务器请求一个网页时,网页中的文本内容需要在网络中传输。这些文本可能包含各种语言的字符。如果不进行编码,服务器发送的原始字符数据可能会因为网络协议或接收端的字符处理方式不同而无法正确显示。比如,UTF - 8是一种常用的网络传输编码格式,它可以将字符编码成字节序列,在网络中传输,然后接收端再通过解码将字节序列还原成原始字符。 2. **存储效率和兼容性的考虑**   - 不同的字符编码方案对于字符的存储空间占用有所不同。早期的ASCII编码只使用7位来表示字符,总共可以表示128个字符,主要是英文字母、数字和一些基本的标点符号。这种编码方式对于只包含英文字符的文本来说,存储效率较高。但是,当需要表示其他语言的字符,如中文、日文、阿拉伯文等,ASCII编码就无法满足需求。   - 像UTF - 8编码是一种可变长度的编码方式。对于英文字符,它通常只占用1个字节,与ASCII编码兼容;而对于其他语言的字符,根据字符的复杂程度,可以占用2 - 4个字节。这样在存储包含多种语言的文本时,既能够有效地利用存储空间,又能保证对各种字符的兼容性。 3. **数据安全和加密方面的应用**   - 编码和解码可以用于简单的数据加密。通过将原始字符按照特定的编码规则进行转换(编码),可以使数据在一定程度上变得难以直接理解。只有知道正确的解码规则的人才能将其还原成原始数据。   - 例如,在一些简单的密码存储场景中,密码可能会先进行编码后再存储在数据库中。当用户登录验证时,输入的密码会经过相同的编码过程,然后与存储在数据库中的编码后的密码进行比较。这样可以增加密码存储的安全性,防止密码以明文形式泄露。 4. **程序内部数据处理的一致性**   - 在程序内部,可能会涉及到从不同数据源读取字符数据,如文件读取、数据库查询等。这些数据源可能使用不同的编码方式。为了保证程序能够正确处理这些字符数据,需要将它们统一解码成程序内部能够理解的字符格式。   - 例如,一个Java程序可能需要读取一个使用UTF - 16编码的文本文件和一个使用ISO - 8859 - 1编码的数据库表中的字符数据。在程序中,需要先将这些数据按照各自的编码方式解码,然后再进行统一的处理,如字符串拼接、搜索等操作,以确保程序的正确性和一致性。


图片.png

图片.png

编码

s='伟大的'
scode=s.encode(errors='replace')#默认是utf-8,因为utf-8中文占3个字符
print(scode)
#b'\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84'

scode_gbk=s.encode(encoding='gbk',errors='replace')#gbk中文占2个字符
print(scode_gbk)
#b'\xce\xb0\xb4\xf3\xb5\xc4'

s2='耶✌️'
scode=s2.encode(encoding='gbk',errors='ignore')#ignore 忽略报错
print(scode)
#b'\xd2\xae'

scode=s2.encode(encoding='gbk',errors='strict')#strict 严格
print(scode)
# Traceback (most recent call last):
#   File "f:\Code\Python\test.py", line 15, in <module>
#     scode=s2.encode(encoding='gbk',errors='strict')#ignore 忽略报错
# UnicodeEncodeError: 'gbk' codec can't encode character '\u270c' in position 1: ille
# gal multibyte sequence

scode=s2.encode(encoding='gbk',errors='replace')#replace  替换成?
print(scode)
#b'\xd2\xae??'


解码

s='伟大的'
scode=s.encode(encoding='gbk',errors='replace')#gbk中文占2个字符

print(bytes.decode(scode,encoding='gbk'))

#伟大的


文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码