关于python字符串编码问题

一,encode和decode

  • 1,python默认字符串是使用Unicode编码。
  • 2,encode作用是将Unicode编码转换成其他编码的字符串。
  • 3,decode是将其他编码的字符串解码为Unicode编码。
  • 4,实例
unicode_str = "我们是unicode编码"
print(type(unicode_str))
# unicode_str进行编码为utf-8编码
utf8_str = unicode_str.encode("utf-8")
print(type(utf8_str))
# 一个Unicode字符被转换为3个UTF-8编码的bytes对象
print(utf8_str)
# 进行解码为Unicode码
unicode_end_str = utf8_str.decode("utf-8")
print(type(unicode_end_str))
print(unicode_end_str)
  • 结果如下:
<class 'str'>
<class 'bytes'>
b'\xe6\x88\x91\xe4\xbb\xac\xe6\x98\xafunicode\xe7\xbc\x96\xe7\xa0\x81'
<class 'str'>
我们是unicode编码
  • 注意:Unicode编码在python中不能再进行解码。而除了Unicode编码不能继续编码,也就是说,如果你已经将Unicode转换为utf-8编码,则不能继续使用encode编码

二,关于不同编码之间的转换

  • 1,上面说过,不能连续编码,所以不同编码之间的转换只能先将其他编码解码为Unicode编码,然后再编码为其他编码
  • 2,实例,将utf-8编码转换为gbk编码
unicode_str = "我"

# 先获取utf-8编码的字符串
# 编码为utf-8编码
utf8_str = unicode_str.encode("utf-8")
print("我是utf_str:", utf8_str, "type:", type(utf8_str))
# 解码为Unicode
unicode_str = utf8_str.decode("utf-8")
print("我是unicode_str:", unicode_str, "type:", type(unicode_str))
# 将uncoide编码为gbk
gbk_str = unicode_str.encode("gbk")
print("我是gbk_str:", gbk_str, "type:", type(gbk_str))
# 这样
# 就完成了不同编码的转换
  • 结果:
我是utf_str: b'\xe6\x88\x91' type: <class 'bytes'>
我是unicode_str: 我 type: <class 'str'>
我是gbk_str: b'\xce\xd2' type: <class 'bytes'>

三,当一个字符串中既有中文又有英文时,有些编码会出错,比如assic编码

  • 实例:
str = "我是Unicode编码"
assic_str = str.encode("ASCII")
  • 当我们尝试给中文使用ascii编码时会报错
Traceback (most recent call last):
  File "C:/Users/26398/Desktop/python/爬虫/存储/strdemo3.py", line 2, in <module>
    assic_str = str.encode("ASCII")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
  • 在爬虫处理中,也会出现混合编码的情况,处理方式是进行错误处理
str = "我是Unicode编码"
"""
默认为strict: 非法字符抛出异常
ignore: 忽略非法字符,不进行转换
replace: 使用?进行替换非法字符
xmlcharrefreplace:使用xml字符引用替代非法字符

"""
assic_str = str.encode("ASCII", errors='ignore')
print(assic_str)
assic_str = str.encode("ASCII", errors='replace')
print(assic_str)
assic_str = str.encode("ASCII", errors='xmlcharrefreplace')
print(assic_str)

结果:

b'Unicode'
b'??Unicode??'
b'我是Unicode编码'