zoukankan      html  css  js  c++  java
  • python2&python3 蛋疼的编码问题

    今天终于把python中蛋疼的编码问题整明白了记录下,和大家分享一下

    对于python2 系统默认编码是ASCII ,不支持中文的,如果出现中文就报错SyntaxError: Non-ASCII character ,所以需要指定# -*- coding:utf-8 -*-   指定后文件编码就变成了UTF-8,这样的话假如终端编码也是UTF-8,那么输出没问题

    如果终端编码是gbk,那么输出是乱码 ,解决方式要先解码为unicode然后再编码为终端编码gbk

    # -*- coding:utf-8 -*-
    
    s = '人生苦短'
    print s.decode('utf-8').encode("gbk")

    注意在decode()时一定要指定由什么方式来解码,如果不指定python2默认以系统编码asci去解码 这样的话就会报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 

    如果上述直接写s.encode(''gbk")那么Python2就会以系统编码asci先去解码那样就会报错 

    总结python2 先要decode("指定编码") 先转换成unicode码 然后再encode("编码")成你想要的编码 这样乱码问题就解决了,还有一种方式就是不用decode()或者在decode()不指定编码那么还想让python系统不以asci解码就要设置默认的系统编码通过sys这个模块

    # -*- coding:utf-8 -*-
    
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    s = "人生苦短"
    print s.decode().encode('utf-8')  # 如果设置了系统默认编码那么在decode()的时候也可以不显示指定编码或者可以将decode()去掉 直接encode('utf-8')因为python2在encode()的时候系统会先去解码为unicode自动就会做这一步
    # print s.encode('utf-8')

    所以python2中字符串的两种数据类型是str 和unicode

    =============================================

    在python3中 字符串的两种数据类型是str 和bytes

    python3文件编码默认是utf-8  通过sys.getdefaultencoding() 可以看到 ,但是文件里的数据编码其实是unicode编码 证明这一点的方法就是假设在代码中 s = '人生苦短' print(s)   在windows下cmd终端编码先设置成gbk那么在终端打印时应该是乱码才对

    因为代码里是utf-8 终端是gbk肯定是乱码,但是出乎意料的是在终端可以正常显示并没有乱,那这一点就可以说明Python3中默认编码是unicode编码并不是utf-8 所以在python3中对于中文来说不管在什么平台下都不用去编码解码了因为unicde万国通用码它本身就支持中文

    但是如果非要编码也可以,但是发现如果编码了显示的是bytes类型的数据了

    In [1]: a = '人生苦短'
    
    In [2]: a.encode('utf-8')
    Out[2]: b'xe4xbaxbaxe7x94x9fxe8x8bxa6xe7x9fxad'

    这时还想将bytes类型的数据转换成字符串就需要

    In [4]: a.encode('utf-8').decode('utf-8')
    Out[4]: '人生苦短'

    发现python3中encode的时候会编码为bytes型数据

    decode()的时候会解码为str型数据

    总结:python3中默认编码就是unicode码不管你在哪个平台下输出都不会乱码就不用再去手动编码解码了

  • 相关阅读:
    2.4 学习总计 之 自己实现底部导航
    2.3 学习总结 之 分页查询
    2.2 学习总结 之 servlet 的两次抽取
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
    Rocket
  • 原文地址:https://www.cnblogs.com/wgDream/p/8358530.html
Copyright © 2011-2022 走看看