【Python】各种编码

问题:做Twitter数据去停用词的处理,遇到“UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence”的错误

分析:终端默认的编码格式是gbk当调用print函数将内容格式化输出到终端时,会将unicode对象转换为终端的编码方式输出,如上面第一次print的结果是正常的,print utf8字节流时,终端按其默认gbk解码显示时就会出问题,即在Windows下Python使用open()函数打开文件时会默认使用gbk解码,即使文件本身存储为UTF-8格式——指定以UTF-8解码方式打开此文件,这样就避免了解码错误,如“open('temp.txt','r',encoding='utf-8')

参考:https://www.polarxiong.com/archives/python-3-open-file-gbk-error.html

http://www.crifan.com/summary_python_unicodedecode_error_possible_reasons_and_solutions/

基本编码类型 

http://www.cnblogs.com/xp1005/p/6385647.html 感谢原作者

ASCII

可表示阿拉伯数字、字母在内的128个不同字符。很明显,汉字在ascii中是无法表示的。
ASCII码一共规定了128个字符的编码,比如A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

其他编码

对于英语来说128个字符就已经够用了,但是对于其他语言来说却不够。因此针对不同的语言先后出现了多种编码方式,例如针对中文的GB2312GBK编码,针对中文繁体的Big5编码等等,这些编码方式都使用多个字节表示一个字符。

Unicode

随着越来越多的编码方式的出现,急需一种能够包含全世界所有符号的编码系统来消灭乱码,这种编码系统就叫做Unicode。Unicode只是一套编码系统,包含所有字符集,却并不规定编码后的二进制代码如何存储。
UTF-32:
使用4个字节存储每一个字符,但是对于英文字符来说,使用ASCII编码只需1个字节即可存储,这极大的浪费了存储空间。 
UTF-8:因此出现了一种变长的编码方式UTF-8,UTF-8是使用得最广泛的Unicode编码实现方式,Python 3的默认编码方式是UTF-8,使用1-4个字节表示一个字符,根据不同的字符变化长度。比如对于英文字符,1个字节就够了,但是对于中文,可能需要2-4个字节才能存储。

Base64

Base64是网络上最常见的用于传输8Bit字节代码的编码方式,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,可用作简单的加密方式。

编码与解码

编码encode():真实字符与二进制串的对应关系,真实字符→二进制串,如 result=result.encode('utf-8') 以utf-8编码 、读写文件的时候多加个参数来设置字符编码:open('test.txt', 'r', encoding='utf-8')
从unicode转str,被看做是把一个信息文本编码为二进制字节流的过程,要用encode方法

解码decode():二进制串与真实字符的对应关系,二进制串→真实字符,如 result=result.decode('GBK', 'ignore' )  以gbk解码, 忽略其中有异常的编码,仅显示有效的编码

实用例子

其他博主整理 http://www.cnblogs.com/mingjiatang/p/4890420.html

可以通过以下代码查看Python 3的字符串默认编码:
import sys
sys.getdefaultencoding()
Python 3的默认编码方式是UTF-8。

使用Python解释器进行如下编码解码操作,在bytes和str之间转换:
>>> '中'.encode()
b'\xe4\xb8\xad'
>>> b'\xe4\xb8\xad'.decode('utf-8')
'中'
用Python以二进制的形式写入文件时,需要先将字符串编码成字节串,然后再写入文件。以二进制的形式读取文件时也是如此,需要将读取的字节串解码成字符串。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值