zoukankan      html  css  js  c++  java
  • Python学习---深入编码学习1225

    1.1. Python2

    Py2中只有2中数据类型,Str和Unicode,而且str中保存的是bytes,Unicode中保存的是unicode

    一切我们能看到的明文都是unicode数据类型, bytes是计算机识别 的内容

    Py2特点:

    Py2是ASCII编码,只能将ASCII里面的字符做转换,其他的会报错

    严格意义上说,str其实是字节串, unicode是一个字符串,str是unicode这个字符串经过编码(utf8,gbk等)后的字节组成的序列。

    unicode才是真正意义上的字符串

    py2编码的最大特点是Python 2 将会自动的将bytes数据解码成 unicode 字符串,不区分str和unicode

    所以在2里我们可以将字节与字符串拼接, 对字节串str使用正确的字符编码进行解码后获得,并且len(u'苑') == 1

    # coding:utf-8            # Py2不添加直接报错
    print '我是谁'            # 一切我们能看到的明文都是unicode数据类型[utf-8 ->Unicode -> Unicode]
    # bytes = str
    print '我是Jackie'        # str 类型内存中是bytes
    print repr('我是Jackie')  #'xe6x88x91xe6x98xafJackie' 一个汉字等于3个字节
    print type('我是Jackie')  # <type 'str'>
    
    print u'我是Jackie'       # 我是Jackie
    print type(u'我是Jackie') # <type 'unicode'>
    
    print 'hello' + u'world'  # world是Unicode编码,但打印成功,因为print里面做了处理,将‘hello'的byte类型转换为了unicode
    # print (u'我是'+'谁')    # 因为中文的unicode无法做ASCII转换,所以报错,需要手动解码                             # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6
                              # in position 0: ordinal not in range(128)

    image

    1.2. Python3

    Py3中只有2中数据类型,Bytes和Unicode, 而且str中保存的是unicode,Bytes中保存的是bytes

    Python3中默认是utf-8,中文占用3个字节 【GBK中文占用2个字节】

    Python 3最重要的新特性大概要算是对文本[unicode]和二进制数据[bytes]作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。

    Python 3 中对 Unicode 支持的最大变化就是将会没有对 byte 字节串的自动解码。如果你想要用一个 byte 字节串和一个 unicode 相链接的话,你将会得到一个错误,不管你包含的内容是什么。

    所有这些在 Python 2 中都将会有隐式的处理,而在 Python 3 中你将会得到一个错误。

    Python3中大量的使用了迭代器,避免了数据一次性全部加载到内存中。

    s = '中国'                  # s里面存的Unicode
    b1 = s.encode('utf-8')
    print(b1, type(b1))         # b'xe4xb8xadxe5x9bxbd' <class 'bytes'>
    print(b1.decode('utf-8'))   # 中国   decode的是Unicode,但是print显示的是明文,中间系统转换了结果
    # print(b1.decode('gbk'))   # UnicodeDecodeError: 'gbk' codec can't decode byte 0xad
                             # 打印的时候因为个数对应不上,所以报错了

    image

    查看中文字符的Unicode编码:

    import json
    s = '中国'                 
    print(repr(s))             # Py2:  repr可以直接查看
    print(json.dumps(s))       # Py3:  u4e2du56fd 

    1.3. 其他

    问:Py2中为什么要添加conding:utf-8才可以打印汉字?utf-8是谁看呢?

    答:给Python2的解释器看,因为Py2的默认编码是ASCII,不能识别中文,所以需要声明编码方式

    问:Py2中文件在磁盘中的编码是什么?

    IDEA有自己的保存格式,所以根IDEA有关,解释器解释的时候是根据我们保存的文件格式去解释的,保存的和解释的要一致了才能执行解释。

    问:Py2在执行的时候的内容跟磁盘的内容是否一样呢?

    答: 转换编码后是一致的,磁盘保存的为计算机识别的二进制文件

    问:Python文件编码的时候是utf-8为什么刚才我们又说字符串在内存中是Unicode编码呢?

    答:Unicode是万国码,不同的系统编码不同,所以Python解释器帮我们解释为Unicode后加入内存,这个时候就不用担心系统解释器解释不了【Py2和Py3一样】

    问:Py2和Py3中print的区别?

    答:在Python 2中,print是一个语句(statement);而在Python 3中变成了函数(function)。

    问:大概的流程是什么?

    答:操作系统基于UTF_8保存的文本   --> 读取进入内存中[UTF-8]  --> 解释器转换我们保存的数据为Unicode编码[我们保存的数据到此都是Unicode]  --> 交给CPU去执行[此时CPU将我们要打印的内容进行了转换

    ASCII: 将二进制翻译成我们能看懂的字符,共计255个符号,所有字符占用8个比特1个字节

    支持中文的第一张表就叫 GB2312

    unicode 万国码  支持所有国家和地区的编码且向下兼容gb2312 , gbk

    2**16 = 65535 = 存一个字符 统一占用2个字节

         UTF-8 = unicode 的扩展集,可变长的字符编码集

    Assic -->Gb2312 ->gbk1.0-->gb18030

    Assic -->unicode -->utf-8(支持所有国家语言,支持中文)   /utf-16

    image

    Py3中只有2种数据类型:str[unicode编码]  bytes[十六进制编码], 2者可以相互转换,其他的转换需要中间转

    1
    bytes-->intint(str(bytes('123', 'utf-8'),'utf-8'))  # 编码

    Py3中合并Py2中的int和long int类型为int类型

    image

  • 相关阅读:
    PyTorch之前向传播函数自动调用forward
    pytorch 调用forward 的具体流程
    Xcode5下使用纯代码构建简单的HelloWorld程序
    浅谈iOS 5的StoryBoard
    iOS单例
    instancetype 对比 id 的好处
    JSP的7个动作指令
    IOS UIView子类UIScrollView
    XCODE4.6从零开始添加视图
    NSSet类型 以及与NSArray区别
  • 原文地址:https://www.cnblogs.com/ftl1012/p/9384304.html
Copyright © 2011-2022 走看看