zoukankan      html  css  js  c++  java
  • 字符串编码相关知识

    一、编码的种类情况

    • ASCII 占1个字节,只支持英文
    • GB2312 占2个字节,支持6700+汉字
    • GBK GB2312的升级版,支持21000+汉字
    • Shift-JIS 日本字符
    • ks_c_5601-1987 韩国编码
    • TIS-620 泰国编码
    • Unicode 2-4字节
    • Unicode Transformation Format(UTF)1-4字节

    二、   Unicode 与 UFT

      由于每个国家都有自己的编码规则,其仅涵盖本国字符,无其他国家字符的对应关系,所以Unicode(万国码)应运而生,它涵盖了全球所有的文字和二进制的对应关系。

     Unicode 起到2个作用:

    1. 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
    2. unicode包含了跟全球所有国家编码的映射关系。

      但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍为了解决存储和网络传输的问题,UTF便诞生了。

    • UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
    • UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
    • UTF-32: 使用4个字节表示所有字符

    所以总的来说,UTF 是为unicode编码设计的一种在存储 和传输时节省空间的编码方案。

    三、字符怎么存到硬盘上的?

      答:是按某种编码转换为二进制存储在硬盘上的。

      在此需要注意的是:以何种编码存到硬盘上,再从硬盘读取出来时,就必须以何种编码读,否则乱码就出现了。

    四、编码转换 

      先来看看python3 执行代码的过程:

    1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
    2. 把代码字符串按照语法规则进行解释
    3. 所有的变量字符都会以unicode编码声明

      我们知道,当你将一个以utf-8编码的程序拿到自己的Windows系统上运行,也是会乱码的,因为只有2种情况 ,你的windows上显示才不会乱:

    1. 字符串以GBK格式显示
    2. 字符串是unicode编码

    当你的程序是GBK编码时,拿到国外的电脑上使用是会乱码的,因为人家根本不支持中文呀,那么怎么办呢,你有如下办法:

    1. 让美国人的电脑上都装上gbk编码
    2. 把你的软件编码以utf-8编码

    >>可是以上两条路似乎都不好走啊,那该怎么办哩??

    >>不要着急,山人自有妙计。你找一个既懂美国语言的,又懂中文的翻译官不就得了么!

    >>这个翻译官是谁呢?

    >>Unicode呀!

      是的,前面不是讲了,unicode支持全球所有语言,而且包含了跟全球所有国家编码的映射关系,所有系统、编程语言都默认支持unicode,所以可以把它作为一个转换器(翻译官),实现不同编码规则之间的转换。

    具体方法就是,decode(解码) 和encode(编码),具体步骤如图:

    代码(py3下运行):

    s = "好好学习"
    print(type(s))  # 打印字符串类型
    s1 = s.encode("gbk")  # 编码
    print(s1, type(s1))
    s2 = s1.decode("gbk")  # 解码
    print(s2, type(s2))
    

     运行结果:

    <class 'str'>
    b'xbaxc3xbaxc3xd1xa7xcfxb0' <class 'bytes'>
    好好学习 <class 'str'>
    

    当然,Python2并不会自动的把文件编码转为unicode存在内存里, 那就只能你自己人肉转。Py3 会自动把文件编码转为unicode存入内存。

    五、Python3与Python2的编码区别

      Python3:

    1、文件默认编码是utf-8;

    2、字符串编码是unicode;

    3、py3将str和bytes做了明确区分,str就是Unicode格式的字符串,bytes就是单纯的二进制。

      Python2:

    1、文件默认编码是ASCII;

    2、字符串编码是ASCII(如果文件头申明了gbk、utf-8等编码形式,则字符串的编码就是gbk、utf-8等格式);

    3、在py2中unicode是一种单独的类型,使用是需要单独申明,如:s = u"美丽”;

    4、在py2中,str和bytes两种类型界限比较模糊,可以说str就是bytes,bytes就是str。

     

    python中常用bytes表示图片、视频等在编码规范中找不到对应字符串的二进制数据。

     

     

     

     

     

     

  • 相关阅读:
    02方法 课后作业1
    HDU 1518
    POJ 2406
    HDU 1953
    HDU 1272
    POJ -- 3842
    POJ -- 3233 求“等比矩阵”前n(n <=10^9)项和
    POJ ---3070 (矩阵乘法求Fibonacci 数列)
    POJ --- 3613 (K步最短路+矩阵快速幂+floyd)
    POJ --- 2918 求解数独
  • 原文地址:https://www.cnblogs.com/yanlin-10/p/9010216.html
Copyright © 2011-2022 走看看