python的编码问题|encode(编码)decode(解码)
来源:互联网 发布:图片扫描仪软件 编辑:程序博客网 时间:2024/05/18 02:09
本文使用的编程环境是centos6.7,python2.7。我们在shell中键入python以打开python命令行,并键入如下两句话:
s = "中国zg" e = s.encode("utf-8")
现在的问题是:这段代码能运行吗?
答案是不能,会报如下的错:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 0: ordinal not in range(128)
【ascii码不能解码byte 0xe4】
请留意一下错误中说明的0xe4,它是我们分析错误的突破口。
e = s.encode(“utf-8”)的意思是将字符串s用utf-8进行编码,并将编码后的字符串赋值给e。问题来了,程序现在知道s中的01串,还知道这个01串表示的是字符串,但这个字符串的编码是什么呢?操作系统只给程序传来了01串,并没有告诉程序这个01串用的字符编码是什么。
此时,python程序就会用它自己默认的编码当作s的编码,进而来识别s中的内容。这个默认的编码是ASCII,所以,它会用ASCII来解释这个01串,识别出字符串的内容,再将这个字符串转为utf-8编码。
好了,程序碰到的第一个字节就是E4(11100101 ),傻眼! ASCII编码中没有这玩意儿啊。ASCII编码中字节第一位都是0啊。
怎么办? 报错呗,于是我们就看到了上面的错误。 错误中的0xe4就是字符 中 的utf8编码的第一个字节。
python是怎么聪明地解决这个问题的呢?
很简单,就是decode!
decode的意思是说,你有一个字符串,并且你知道它的编码,只要你用该编码decode这个字符串,那么,python就会识别出里面的字符内容,同时,建一个int数组,将每个字符的unicode序号存进去。
所有的字符串都这样做,就可以确保在程序运行过程中,各种来源获得的字符串都有一样的表示。它们就可以方便地进行各种操作了。上面说的 int数组会被python封装成一个对象,即unicode对象。
下面,我们在python命令行中输入如下两行代码:
e = s.decode("utf-8")isinstance(e,unicode)
程序的输出是True,这说明,decode后返回的e确实是一个unicode对象。
unicode在这里是一个类,是python里面的类。
e 被称作unicode字符串,意思是说,它存的是字符的unicode序号,并没有使用任何编码。
然后,我们就可以将e编码成任意一种编码,比如下面的操作都是可以的
e.encode("utf-8")e.encode("gbk")
只要你选择的编码能够对e中的字符进行编码即可,如果不能编码,就会报错。
比如,如果你尝试这样:
e.encode("ascii")
由于ASCII并不能编码 中国 这两个字符,所以会爆出 encode error。
至此,我们已经看到了两种错误,decode error 和encode error,并解决了它们。
- python的编码问题|encode(编码)decode(解码)
- 编码&解码(encode & decode)
- Python编码解码问题 encode decode
- python 编码乱码问题(decode,encode)
- Python中的编码(encode)与解码(decode)
- Python中的decode解码和encode编码
- Python字符串的编码与解码(encode与decode)
- Python字符串的编码与解码(encode与decode)
- Python字符串的编码与解码(encode与decode)
- python中文的编码问题(使用decode('gbk').encode('utf-8')和decode('utf-8').encode('gbk'))
- 8.python中字符串的编码和解码问题——decode/encode
- 数据库乱码问题 & Python 编码问题(Unicode 的 encode、decode 相互转换 )
- js 中编码(encode)和解码(decode)方法 .
- js 中编码(encode)和解码(decode)方法
- URL解码(Decode)/编码(Encode)
- URL解码(Decode)/编码(Encode)
- URL解码(Decode)/编码(Encode)
- Python中的字符编码问题encode/decode
- recyclerView自定义点击事件
- ./和../以及/之间的区别?
- springMVC入门,以及maven,tomcat配置
- Android--------------无线轮播,Xlistview展示数据并保存到数据库。
- 算法笔记--c++STL
- python的编码问题|encode(编码)decode(解码)
- 吐槽垃圾
- IPC通信方式之LocalSocket
- 012-人格特质|你有却不自知的优势
- MySql基础笔记_17-06-28
- DOS命令大全:Findstr命令详解
- JNI遇到error: request for member 'FindClass' in something not a structure or union
- 数据挖掘-kaggle
- JetBrains