zoukankan      html  css  js  c++  java
  • 字符编码

    字符编码历史:

    ASCII:英文和特殊字符占1个字节,没有中文。 

    GB2312:收录了6763个常用汉字和682个其它符号; 

    GBK: 为了满足中文,中国人定制了GBK,GBK是从GB2312扩展而来的,支持繁体,并且兼容GB2312; 

    Unicode:把所有语言都统一到一套编码里,这样就不会再有乱码问题了;所有的编码转换都要经过Unicode,兼容GBK所有的编码,中文字符、 英文字符都占用2个字节。 

    GB18030: GB2312和GBK都是用两个字节来编码的,它采用类似UTF-8的编码方式进行编码(每个字符的编码可以是1、2或4个字节),拥有上百万个编码空间,足以支持中日韩三国所有汉字,并且还可以支持国内少数民族的文字。 

    UTF-8:西方国家觉得Unicode空间占用大,Unicode英文字符占用2个字节;之前ASCII才占用一个字节,所以发明UTF-8;UTF-8英文占用1个字节;中文占用3个字节;英文按照ASCII的形式存储;

    注意: 

    Unicode 格式在utf-8编码里面可以直接正常使用的,utf-8是Unicode的扩展集


    python2中:
    存的是编码的字符串

    str类型

    当python解释器执行到产生字符串的代码时(例如s='林'),会申请新的内存地址,然后将'林'encode成文件开头指定的编码格式,这已经是encode之后的结果了,所以s只能decode 文件开头定义的类型,然后再进行操作

    str就是编码后的结果bytes,str=bytes,所以在python2中,unicode字符编码的结果是str/bytes;

    python2中默认编码是ASCII,不支持中文,所以 print('中国') 会报错;

    python3中:

    存的是unicode编码,所以只能encode任意编码,然后再进行操作

    s='林' #当程序执行时,无需加u,'林'也会被以unicode形式保存新的内存空间中;

    当我们保存的的时候,.py文件就以pycharm默认的编码方式保存到了磁盘;关闭文件后再打开,pycharm就再以默认的编码方式对该文件打开后读到的内容进行解码,转成unicode到内存我们就看到了我们的明文;

    而如果我们点击运行按钮或者在命令行运行该文件时,py解释器这个软件就会被调用,打开文件,然后解码存在磁盘上的bytes数据成unicode数据,这个过程和编辑器是一样的,不同的是解释器会再将这些unicode数据翻译成C代码再转成二进制的数据流,最后通过控制操作系统调用cpu来执行这些二进制数据,整个过程才算结束。

    python3默认编码的utf-8,可以通过如下方式查询:

    import sys

    print(sys.getdefaultencoding())
     
    在python 2.7.5代码如下:

    #coding:utf-8

    #s = u"你好"
    s = "你好"
    s_to_unicode = s.decode("utf-8")
    print (s_to_unicode)
    s_to_gbk = s_to_unicode.encode("gbk")
    print(s_to_gbk)
    gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
    print(gbk_to_utf8)

    Xshell 是Utf-8 输出如下:

      

    Xshell 是gbk 输出如下

     

    decode("utf-8")是解码前是:utf-8

    encode("gbk")是编码后是:gbk

    不管在Python2还是Python3中:解码都是解码成Unicode

    Python3.7.0中如下:

    #coding:GBK
    s = "你好"
    s_gbk = s.encode("gbk")
    print('gbk',s_gbk)
    print('utf-8',s.encode("utf-8"))
    print(s.encode())
    gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8")
    print('utf8',gbk_to_utf8)
    输出如下:

    gbk b'xc4xe3xbaxc3'
    utf-8 b'xe4xbdxa0xe5xa5xbd'
    b'xe4xbdxa0xe5xa5xbd'
    utf8 b'xe4xbdxa0xe5xa5xbd'

    Python3中encode()默认编码成utf-8 ,在Python3中encode(编码)不仅转换了编码还变成了bytes(字节);

     utf-8,gbk,unicode等这些都是文件内容中字符串的编码,bytes是计算机存储的编码,数据不管存在内存还是硬盘中都是以bytes类型存储;

    --------------------------------------------------------------------

    f = open('a.txt','r+',encoding='GBK')

    其中encoding='GBK'是指打开的文件的编码是GBK
    --------------------------------------------------------------------
    python3 中
    s.decode() 括号里面不写编码,默认是utf-8编码;

    参考:

    https://www.cnblogs.com/alex3714/articles/7550940.html    (主要看这个)

    https://www.cnblogs.com/zihe/p/6993891.html

    https://www.cnblogs.com/575dsj/p/7112767.html

    http://www.cnblogs.com/yuanchenqi/articles/5956943.html

  • 相关阅读:
    SIFT算法详解(转)
    相似图片搜索的原理(二)(转)
    相似图片搜索的原理(转)
    几种常见模式识别算法整理和总结(转)
    Android客户端与服务端交互之登陆示例
    Android中SQLite使用
    音视频转码后合成的一些例子
    Android MediaCodec 使用例子
    (转)H264(NAL简介与I帧判断)
    Android Camera 使用一例,视频聊天app
  • 原文地址:https://www.cnblogs.com/lighthouse/p/9375917.html
Copyright © 2011-2022 走看看