zoukankan      html  css  js  c++  java
  • py2和py3的字符编码

    Python 两个版本中字符串的区别

    Python2到python3版本一个最大的最明显的区别就是python3支持中文了
    python2:python2使用的是ASCII码编码的,所以默认是不支持中文的,程序中有中文都不能正常的保存。但是可以在开头加上这句# -- coding:utf-8 -- 来设置程序的编码就可以了,当使用print输出中文时又发现有些能正常输出有些却是乱码,这时只要将不能正常输出的中文字符串前面加上’u’字母就可以了。到这里就已经引出了python2中的两种字符串类型,str和unicode,可以简单的理解为str是机器能识别的字符串,而unicode是我们能看懂的字符串,str可以解码(decode)成unicode,unicode可以编码(encode)成str。在idle的shell中中文会成’gbk’的编码,用什么编码就得用什么解码。

    例,在python2中:

    >>> a =  '中文'
    >>> a
    '\xd6\xd0\xce\xc4'
    >>> b = u'中文'
    >>> b
    u'\u4e2d\u6587'
    >>> a.decode('gbk')
    u'\u4e2d\u6587'
    >>> b.encode('gbk')
    '\xd6\xd0\xce\xc4'
    

    在python3中使用的就是unicode国际编码,utf-8是unicode编码的一种形式,是支持中文的。Python3中的字符串有两种,str和bytes,这里str其实就是python2中的unicode,而bytes是python2中的str。所以这里的str可以编码(encode)成bytes,bytes可以解码(decode)成str。
    例,在python3 中:

    >>> a = '中文'
    >>> a
    '中文'
    >>> a.encode('utf-8')
    b'\xe4\xb8\xad\xe6\x96\x87'
    >>> b = b'\xe4\xb8\xad\xe6\x96\x87'
    >>> b
    b'\xe4\xb8\xad\xe6\x96\x87'
    >>> b.decode ('utf-8')
    '中文'
    

    #_*_coding:utf-8_*_
    
    '''
    什么是编码?
    首先,我们从一段信息即消息说起,消息以人类可以理解、易懂的表示存在。
    我打算将这种表示称为“明文”(plain text)。对于说英语的人,纸张上打印的或屏幕上显示的英文单词都算作明文。
    其次,我们需要能将明文表示的消息转成计算机识别的编码文本表示,我们还需要能将编码文本转回成人能看懂的明文。
    从明文到编码文本的转换称为“编码encode()”,从编码文本又转回成明文则为“解码decode()”。
    python2 会自动把中文字符输出为16进制编码
    http://www.mytju.com/classcode/tools/encode_utf8.asp
    字符	编码10进制	编码16进制	Unicode编码10进制	Unicode编码16进制
    路	   15251375	    E8B7AF	      36335	                8DEF
    飞	   15311774	    E9A39E	      39134	                98DE
    
    
    py2编码
    str和unicode
    str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。
    对UTF-8编码的str'苑'使用len()函数时,结果是3,因为utf8编码的'苑' == '\xe8\x8b\x91'。
    而unicode是一个字符串,str是unicode这个字符串经过编码(utf8,gbk等)后的字节组成的序列。如上面utf8编码的字符串'汉'。
    unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'苑') == 1。
    在Py2里,str=bytes。
    py2编码的最大特点是Python2 将会自动的将bytes数据解码成 unicode 字符串
    所以在2里我们可以将字节与字符串拼接。
    #coding:utf8
    
    print '苑昊' #  苑昊  在python2的cmd中输入 print '苑昊' 输出的还是 '苑昊'
    print repr('苑昊')#'\xe8\x8b\x91\xe6\x98\x8a'
    
    print (u"hello"+"yuan")
    
    #print (u'苑昊'+'最帅')   #UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6  in position 0: ordinal not in range(128)
    
    两个问题:
    1 print '苑昊' :本来存的是'\xe8\x8b\x91\xe6\x98\x8a',为什么显示了 苑昊 的明文?
    2 字节串和字符串可以拼接?
    这就是那些可恶的 UnicodeError 。你的代码中包含了 unicode 和 byte 字符串,只要数据全部是 ASCII 的话,所有的转换都是正确的,
    一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效,从而造成 UnicodeDecodeError 的错误。
    Python2 悄悄掩盖掉了 byte 到 unicode 的转换,让程序在处理 ASCII 的时候更加简单。你复出的代价就是在处理非 ASCII 的时候将会失败。
      
    再来看看encode()和decode()两个basestring的实例方法,理解了str和unicode的区别后,这两个方法就不会再混淆了:
    '''
    
    # python2中,str和byte是同一种类型
    
    print("len",len('苑'),'苑')  # ('len', 3, '\xe8\x8b\x91') 对UTF-8编码的str'苑'使用len()函数时,结果是3,因为utf8编码的'苑' == '\xe8\x8b\x91'。
    
    print '苑昊' #  苑昊  在python2的cmd中输入 print '苑昊' 输出的还是 '苑昊'
    print repr('苑昊')#'\xe8\x8b\x91\xe6\x98\x8a'
    print ('路飞')
    print (u"hello"+"yuan")
    #print (u'苑昊'+'最帅')  # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
    
    print (u'苑昊'+u'最帅')
    print (u"hello"+"yuan")
    
    s = "路飞"
    print("16>>>",s,type(s))   # 输出: ('16>>>', '\xe8\xb7\xaf\xe9\xa3\x9e', <type 'str'>)  16进制的            &#x8DEF;&#x98DE;
    
    
    ''' 单独能输入'路飞',但是和其他带英文的字符串一起输入,就自动转成了16进制的字节 你的代码中包含了 unicode 和 byte 字符串,
    # 只要数据全部是 ASCII 的话,所有的转换都是正确的,
    # 一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效,从而造成 UnicodeDecodeError 的错误。
    '''
    print(s) 
    
    s2 = s.decode('utf-8') # 将utf编码写的文字 解码成unicode  
    print('unicode',s2,type(s2))  #  输出 ('unicode', u'\u8def\u98de', <type 'unicode'>)
    
    s3 = s2.encode("GBK") # 将unicode编码u'\u8def\u98de'  编码成unicode
    print('GBK',s3)
    
    
    
    写入自己的博客中才能记得长久
  • 相关阅读:
    AMD 开源照片级渲染引擎 Radeon ProRender
    删除集群mds
    删除集群mds
    一次旅途她和豆浆结缘,如今拥有70多家加盟店
    小伙居然开网店卖花,整整一年时间他做出了400万元的业绩
    带着800元现金开始创业,居然开出了十几家连锁超市
    北大学霸从小米离职,靠眼镜打开亿万市场
    广西农民靠养猪发家致富,采用新模式既有效益又保护生态
    在母婴产品领域他独领风骚,利润已经突破了1亿
    80后小伙白手起家做照明生意,为他创造了六千万元的业绩
  • 原文地址:https://www.cnblogs.com/heris/p/13951437.html
Copyright © 2011-2022 走看看