zoukankan      html  css  js  c++  java
  • 笔记三:python2乱码深度剖析一

    一:学习内容

    • python编码转换
    • python乱码原因深入解析

    二:python编码转换

    1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的。

    2. Python编码转换通常是要以unicode作为中间编码进行转换的,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

    3. Python编码转换实例:gbk存储的字符—>decode('gbk')—>unicode—>encode('utf-8')

    编码转换流程解析如下:

    a.  decode作用是将其他编码的字符串转换成unicode编码

    例如name.decode('GB2312'),表示将GB2312编码的字符串name转换成unicode编码。

    b.  encode的作用是将unicode编码转换成其他编码的字符串。

    例如name.encode('GB2312'),表示将unicode字符串name转换成GB2312编码。

    c.  进行编码转换的时候必须先知道name是哪种编码,然后decode成unicode编码,最后在encode成需要的编码。

    d.  name已经就是unicode编码了,那么就不需要进行decode进行解码转换了,直接用encode就可以编码成你所需要的编码。

    三:python乱码原因剖析

    1. raw_input("请输入字符串".decode('utf-8').encode('gbk')),正常输出

    可以看到这里打印是正确的,不会乱码。

    原因:上面我已经学习了python编码转换,必须要用unicode作为中间码来转换,此处文件是utf-8,而cmd默认编码为gbk,所以我们中文需要先解码成unicode(decode('utf-8')),在编码成gbk(encode('gbk'))就可以正常显示了

    2. raw_input(u"请输入字符串".decode('utf-8').encode('gbk')),输出报错

    因为加上u的意思是解码成unicode,此时你又执行了解码. decode('utf-8')就会报错.decode('utf-8')作用就是u’中文’解码unicode。

    3. print u"中文",打印正常中文

    对于字符串的打印,python的逻辑为:

    a.  如果unicode字符串,则可以自动编码为终端所用编码然后正确显示出来。

    比如u’中文’即将’中文转换unicode字符输出到windows默认编码的gbkcmdpython可以自动将unicode编码为gbk,然后输出到cmd

    print u’中文’的效果类似 print '中文'.decode(‘utf-8’)

    需要注意的是:你所要打印出来的字符,虽然是unicode,但是其中如果包含了某些特殊字符,而对应的特殊字符在终端所用的编码中不存在,比如将含某些特殊字符的Unicode字符串,打印到windows的默认编码为GBKcmd中,而GBK编码集合中,本身就没有这些字符,所以,当然也是无法显示,会出现对应的UnicodeEncodeError的错误的。

    b.  如果某种编码类型的str,则需要该str的编码类型目标终端匹配

    比如gbk的字符串,输出到windows默认编码为gbk的cmd中,就不会乱码。

    字符串的类型也就是我们上面说的是字符串的编码,是由文件所用的实际编码决定的,即文件保存为什么编码格式的字符串就是什么编码格式。如:文件声明为#encoding=utf-8,文件保存为gbk,则文件中字符串格式为gbk。

    比如utf-8字符串,输出到windows默认编码为gbk的cmd中,就会乱码,我们需要将该utf-8字符串.decode('utf-8')即解码为unicode编码,然后.encode('gbk')(注意:此处不进行.encode('gbk')也可以,因为上面说了print打印系统可以自动将unicode编码为终端所用编码)才能在cmd中正常输出。字符的编码和解码,要求解码的字符串与当前字符串的编码(文件保存为什么类型字符串编码就是什么类型)一致。

    即windows默认情况下cmd的输出中:

    print u'中文' == print '中文'.decode('utf-8') == print '中文'.decode('utf-8').encode('gbk')

    3. 输出字典中的中文

    我们知道字典中如果有中文,一般打印出来都是显示的存储的编码模式:

    不能显示成中文可以用如下办法来打印整个字典并让中文正常显示

    #encoding=utf-8

    import json

    a={u'测试':0,u'开发':0}

    dic={}

    for i in a:

        dic[i]=0

    print json.dumps(dic,ensure_ascii=False,encoding='utf-8')

    这样就能显示成中文了。

  • 相关阅读:
    从下拉菜单设计细节看Amazon对用户体验的把握
    单行省略号纯css解决方案
    2013年度最新整理45个div+css兼容性问题与解决方案
    20个非常绚丽的 CSS3 特性应用演示
    分享30个最佳 jQuery Lightbox 效果插件【只收藏经典】
    如何让网站被快速收录?
    About FAR HTML
    前端工具
    Web设计师必备的10款最佳排版工具
    清除浮动解决方案
  • 原文地址:https://www.cnblogs.com/miaomiaokaixin/p/6590154.html
Copyright © 2011-2022 走看看