「python」ghost 编码问题
ghost
参考
Alex-金角大王在知乎上关于python编码的回答,链接:https://www.zhihu.com/question/31833164/answer/381137073
这一篇总结的标题之所以是「ghost」鬼魂,是因为这个问题就像「ghost」一样,随时会出现在我的代码,我的程序中,时不时会冒出来,然后需要解决。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence"
首先编码有很多种例如:
- ASCII 占1个字节,只支持英文
- GB2312 占2个字节,支持6700+汉字
- GBK GB2312的升级版,支持21000+汉字
- Shift-JIS 日本字符
- ks_c_5601-1987 韩国编码
- TIS-620 泰国编码
虽然每个国家都有自己的编码,但是这种编码会有局限性!!!!就是无法对应其他国家的字符。
Unicode编码出现,Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...
Unicode 起到了2个作用:
- 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
- unicode包含了跟全球所有国家编码的映射关系(这个很关键,就如unicode 知道gbk 编码是0100101010对应unicode 里面的啥编码)
虽然Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间!!!!例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。
为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!
UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32: 使用4个字节表示所有字符;
总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。
字符在硬盘上的存储
无论以什么编码在内存里显示字符,存到硬盘上都是2进制。
ascii编码(美国): l 0b1101100 o 0b1101111 v 0b1110110 e 0b1100101 GBK编码(中国): 老 0b11000000 0b11001111 男 0b11000100 0b11010000 孩 0b10111010 0b10100010 Shift_JIS编码(日本): 私 0b10001110 0b10000100 は 0b10000010 0b11001101 ks_c_5601-1987编码(韩国): 나 0b10110011 0b10101010 는 0b10110100 0b11000010 TIS-620编码(泰国): ฉัน 0b10101001 0b11010001 0b10111001 要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读
编码的转换
请问:中国的电脑上有一个文件用的GBK 编码,而不是UTF-8,要放在歪果仁的电脑上(没有GBK编码)怎么办?
两个对策:
- 让歪果仁的电脑上都装上gbk编码
- 把你的文件编码转成以utf-8编码
反正这两种办法都很费劲
unicode其中一个功能是其包含了跟全球所有国家编码的映射关系,意思就是,你写的是gbk的“路飞学城”,但是unicode能自动知道它在unicode中的“路飞学城”的编码是什么
Python3的执行过程
python3 执行代码的过程
- 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
- 把代码字符串按照语法规则进行解释,
- 所有的变量字符都会以unicode编码声明
UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8
- decode示例
#在python2中 #_*_coding:utf-8_*_ s = '路飞学城' print s s2 = s.decode('utf-8') print s2 print type(s2)
输出:
乱码 路飞学城 unicode
- encode 示例
# 在python2中 #_*_coding:utf-8_*_ s = '路飞学城' print s s2 = s.decode('utf-8') s3 = s2.encode('GBK') print s3 print type(s3)
输出:
乱码 路飞学城 str
所以
- utf-8可以 decode 解码成unicode
- unicode 也可以 encode 编码成 gbk

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
区块链开发公司应用软件 区块链能够做什么
自从进入2018年,区块链技术迎来了一波新的爆发,区块链技术超越大数据、人工智能、自动驾驶等新新兴技术,成为当下最热门的技术之一。天下攘攘皆为利来,也许,在很多人眼中,区块链之所以让人趋之若鹜,就是它可以用来发代币,割韭菜,让人一夜走上人生巅峰。 然而,在今年的两会中,几个互联网大佬代表委员对区块链的看法,用一句说就是,区块链可以,但是不发币。[那么,此时大家肯定会问区块链不发币,还能做什么?]() 区块链数据库的一个特征就是它有自己的历史。因此,它们通常被称为不可变的。换句话说,更改数据库中的条目将是一项巨大的工作,因为它需要在每个节点上更改之后出现的所有数据。通过这种方式,它更像是一个记录系统而不是数据库。 区块链具有不可篡改性,可以利用这一特点用在一些资料比较重要的档案上做为记录,也可以在医院里给病人、药品的流通做记录,还可以在公安局里面做记录,便于查找嫌疑人的信息,还可以在公司企业的财务链上做记录,一般大公司都会有贪污或者是挪用公款的现象,用这一技术,那便不怕了。 区块链技术的可溯源的技术,在现在和这个鱼龙混杂的时代,时常都会有次品伪劣品的出现,而我们却不以为然,当做正常的东西...
- 下一篇
【JavaScript游戏开发】使用HTML5+Canvas+JavaScript 封装的一个超级马里奥游戏(包含源码)
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/81941806 这个游戏基本上是建立在JavaScript模块化的开发基础上进行封装的,对游戏里面需要使用到的游戏场景进行了封装,分别实现了Game,Sprite,enemy,player, base,Animation 等游戏类,后续代码还可以继续优化,最终实现的效果如下: 其他的所有核心代码已经开源:https://github.com/xiugangzhang/SuperMarioGame 在线预览游戏效果: http://htmlpreview.github.io/?https://github.com/xiugangzhang/SuperMarioGame/blob/master/index.html 感兴趣的朋友可以对其进行继续优化,加上后续的其他功能! 其中游戏Game类代码如下: // 完成Game类的封装 function Game(cfg) { for...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作