在讲这个问题之前,我们先说说unicode的工作原理。unicode包含了跟全球所有国家编码的映射关系,就是不管你用哪个国家的编码,unicode都能找到它在unicode中的编码。那么无论你用什么编码储存数据,只要这台电脑的系统支持unicode,那么你把数据放到内存里读,系统就会用unicode把你的编码解出来。现在所有的系统和编程语言都默认支持unicode。

下图是unicode的关系映射,其包含了跟全球所有国家编码的关系映射:

utf-8是unicode的一种优化,utf-8在英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。值得注意的是:utf-8在进行内存储存时还是用的unicode编码,在文件储存中用的才是utf-8编码。原因如下:

下面进入正题:

phython3默认编码是utf-8, 内存里(也就是字符串) 是编码是unicode,即使声明了某种编码,在内存里还是unicode。

python2文件默认编码是ASCII,字符串默认也是ASCII,但是如果文件头声明了某种编码,那字符串编码就是那个编码。但是python2有一个问题,就是如果你想写中文,你的文件头声明了utf-8,python2的解释器会用你声明的编码去给你解码,加载到内存后也是用utf-8给你解码,而不是unicode!这就意味着,你用windows(中文版windwos默认编码是gbk)去执行的话就会出现乱码。因为在windows上只有2种情况 ,你的windows上显示才不会乱:

  1. 字符串以GBK格式显示
  2. 字符串是unicode编码

为什么在内存中用utf-8会出现乱码,用unicode就不会呢?原因如下:

utf-8虽然压缩了存储空间,但是如果在内存中存储,使用utf-8却由于它的长度不固定,带来了很大的不便,使得在内存处理字符变得复杂。应对这个问题的解决策略是:在内存中存储字符时还是使用unicode编码,因为unicode编码的长度固定,处理起来很方便。而在文件的存储中,则使用utf-8编码,可以压缩内存,节省空间。这里一般有个自动转换的机制,即从文件中读取utf-8编码到内存时,会自动转换为unicode编码,而从内存中将字符保存到文件时,则自动转换为utf-8编码。

解决办法就是用decode和 encode

什么是decode和encode:

字符串在Python内部的表示是Unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符转换成unicode编码,如str1,decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2,encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要明白,字符串str是什么编码,然后decode成unicode编码,然后再encode成其他编码。

另外,在python2里unicode是一个单独的类型。

参考:https://www.cnblogs.com/alex3714/articles/7550940.html

转载于:https://www.cnblogs.com/lshedward/p/9922939.html

python3与python2的编码问题相关推荐

  1. 纠结的Python2.7编码与os.walk()函数的目录参数

    Python3与Python2.x系列的编码处理(类型,文件等)有所不同,具体这里就不再介绍了,网上有很多相关文章. 这里分享一个纠结了非常久的问题(因为一开始没特别注意函数参数的编码问题,所以浪费了 ...

  2. python2默认编码_解决Python2.x编码之殇

    Python编码问题一直困扰了我许久,之前有过一些总结,但并不系统,比较凌乱.当然python2.x编码问题本身,便是剪不断理还乱.本篇将系统介绍python2.x编程中会遇到的一些编码问题,并给出解 ...

  3. python3默认的代码编码是什么-Python3 到底什么是字符编码

    我之前老是有这种感觉, 就是明明已经看过很多关于字符编码的资料了, 感觉字符编码相关的知识点不难理解, 觉得自己已经把字符编码给弄懂了, 但当别人问我到底什么是字符编码, Unicode是什么啊, U ...

  4. python2字符串编码方式_一、基础部分-2.字符串编码

    一.字符编码历史 1. ASCII 美国人搞了个ASCII码表,把123abcABC%$#(数字.字母.特殊符号) ,全部用10进制的数字表示.例如数字65,代表着"A" ,ASC ...

  5. map python2 python3 兼容,Python2与Python3兼容

    Python2与Python3兼容 python3写的代码如何也能在pyhon2上跑?请无论如何加上这一句,python3没有啥影响 from __future__ import absolute_i ...

  6. Python2中编码错误---重组人表皮生长因子凝胶(易孚格式转化为UTF-8...

    Python2中编码错误---éç»äººè¡¨ç®çé¿å å­åè¶(æå­格式转化为UTF-8 在python2的使用中,总会遇到各种各样的编码问题,这也是使用Python2最头疼的一件事情,幸 ...

  7. python3对比python2的更新点

    python3对比python2的更新点: Python2官方基础模块:urllib2 第三方功能包:requests python3中urllib库和urilib2库合并成了urllib库. 其中u ...

  8. python中3or5什么意思_示例详解Python3 or Python2 两者之间的差异

    每门编程语言在发布更新之后,主要版本之间都会发生很大的变化. 在本文中,Vinodh Kumar 通过示例解释了 Python 2 和 Python 3 之间的一些重大差异,以帮助说明语言的变化. 本 ...

  9. python3.82版本安装_CentOS7下安装Python3和Python2并存

    (一)简述 刚安装的centos7.4版本默认是安装Python2.7,由于一些命令需要使用的原因,比如yum等,使用的是2.7.5版本的,由于现在很多库包括django都是使用Python3, 因此 ...

最新文章

  1. Selenium2Lib库之输入常用关键字实战
  2. CentOS中安装mysql
  3. 如何判断Socket连接失效
  4. bool类型0和1真假_MySQL整理5—数据类型和运算符
  5. 华为的数字化转型与数据治理
  6. 新功能:阿里云负载均衡SLB支持HTTP/HTTPS超时时间自定义功能
  7. 蚂蚁集团2021反诈骗治理报告:“注销校园贷”类诈骗资损降85%
  8. 95-847-042-源码-Netty-NettyServer创建
  9. 删除此条访问记录对方还能看见吗_[转]到底什么是事务啊,学废了吗?
  10. 看剧流畅还省电?视频类应用预缓存策略功耗评测详解
  11. flex弹性布局学习总结
  12. Scripting for Testers 测试人员脚本编程教程 Lynda课程中文字幕
  13. 土壤质地标准转换程序Java MVC模式
  14. 力扣(Leetcode)633 平方数之和
  15. vue实现websoket即时通讯
  16. (logN)²是O(N)的
  17. 火水未濟 (易經大意 韓長庚)
  18. Android APP memory用量如何回收
  19. MySQL binlog存储格式笔记
  20. 已经安装了 AccessDatabaseEngine.exe,还是报错

热门文章

  1. mysql 5.7 修改密码_又忘记密码啦?教你几种更改密码的方式
  2. python编程基础知识点上的问题_python编程入门之二:必备基础知识
  3. 用Spark实现简单的单词统计
  4. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
  5. 一张图搞定iOS学习路线
  6. 数字建模matlab,Matlab基础及数学建模.ppt
  7. AMI:加密的机器映像。卷
  8. vue2.0实现底部导航切换效果
  9. Node.js 添加 C/C++ Addon
  10. C# .net中cookie值为中文时的乱码解决方法