zoukankan      html  css  js  c++  java
  • python3与python2的编码问题

    在讲这个问题之前,我们先说说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

  • 相关阅读:
    OpenResty 社区王院生:APISIX 的高性能实践
    【社群话题分享】有哪些程序员专属的“土味情话”?
    第一次亲密接触——二狗子初识 CDN
    又拍云叶靖:OpenResty 在又拍云存储中的应用
    【社群话题分享】程序员中年真这么难?
    Zabbix日常监控之lvs监控
    zabbix日常监控Apache2.4
    Centos7 apache2.4.29(httpd) 安装
    grafana的安装与设置(一)
    zabbix日常监控项java(四又分之一,通用性强)
  • 原文地址:https://www.cnblogs.com/lshedward/p/9922939.html
Copyright © 2011-2022 走看看