关于python字符串编码问题
关于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编码'