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

      声明:本文参考 Python字符编码详解

        

            在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果
    计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节码,我们能看懂的只有字符,所以就需要用程序把字节码翻译成字符,要
    将字节码翻译成字符,必须在字节码和字符之间建立一种逻辑映射的关系, 我们就使用这种逻辑映射的关系在字节码和字符之间互相
    转化,这种逻辑映射关系我们就称之为字符集。
          所以字节码和字符之间的翻译过程就是编码或者解码的过程,至于这种逻辑映射关系,计算机早期是老外发明的,而他们顶多使用
    128个字符,所以就建立了一种称之为ASCII的逻辑映射关系,但是随着计算机的普及很明显128个字符不能表示所有人类所能识别的字
    符,于是各个国家各个名族就发明了合适自己语言的逻辑映射关系比如中文的GBK,韩文的ks_c_。多种逻辑映射关系就使得写程序变
    得混乱,于是就建立一个全球通用的逻辑映射关系UCS,USC几乎可表示全球所有的字符,USC中每个字符对应一个码元(也就是一个整数
    ),比如 "汉" 子对应的码元是 67721(6c49)。
          当然UCS只是定义了一个标准的逻辑映射关系,至于怎么实现则有很多种方式,比如"汉"在UCS中的码元是 6C49,我们知道在计算机
    中任何数据都是以一个字节一个字节的形式存储的,6C49 很明显不能用一个字节表示,那么改用几个字节表示合适呢?于是就有了几
    中不同的解决方案 UCS-2(也就是UTF-16)则使用2个字节表示,USC-2是定长存储中所有字符都是用两个字节表示,按照楼主说法美国
    人觉得亏了英文字母只用一个字节就能保存了,英文之外在用多字节表示也就是UTF-8解决方案。也就说UCS只是一个可扩展的字典(
    如果遇到一个它不能翻译的字符,则把它加入到这个字典中,并为这个字符定义一个码元),UTF-8,UTF-16则是具体的实现方式。

        str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == 'xE6xB1x89'。

       unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1。

       Python中的 str 本质是一个 字节串类似于 Java中的 byte[],而unicode则相当于Java中的 String

       下面通过Python和Java代码的例子来对比:

      Python代码:

     1 u = u''
     2 s = ''
     3 print repr(u)            #输出  u'u6c49'
     4 print repr(s)            #输出  'xe6xb1x89'
     5 print len(u)             #输出  1
     6 print len(s)             #输出  3
     7 print repr(s[1:])        #输出  'xb1x89'
     8 
     9 s2 = u.encode('utf-8')  
    10 print repr(s2)           #输出  'xe6xb1x89'
    11 u2 = s2.decode('utf-8')  
    12 print repr(u2)           #输出  u'u6c49'

        我们可以用看出 unicode 表示真正的字符串,而 str 只是 unicode编码后的字节串(可以理解为字节数组)

        如果我们直接用 s = '汉' 其实python已经对 '汉'进行了编码,也就是说 s 指向的是'汉'编码后的字节串

        上段Python代码中编码和解码的过程用Java表示为:

    String s = "汉";
    byte[] bytes = s.getBytes("UTF-8");       //编码的过程
    String s2 = new String(bytes, "UTF-8")    //解码的过程

        

        Python中读写文件本质上是对字节串的读写

    1 f = open('test.txt')
    2 u = u''
    3 s = u.encode('utf-8')
    4 f.write(s)
    5 f.close()

       我们打开test.txt文本后,文本中显示"汉"

       Java代码:

    String s = "汉";
    byte[] bytes = s.getBytes("UTF-8");
    RandomAccessFile f = new RandomAccessFile("test2.txt", "rw");
    f.write(data)
    f.close()

       同样打开test2.txt后文本后,文本中显示 "汉"

       Python中读文件

    f = open('test.txt', 'r')
    s = f.read()
    u = s.decode('UTF-8')

       Java读文件

    1 FileInputStream fin = new FileInputStream("test2.txt");
    2 byte[] bytes= new byte[3];
    3 fin.read(data2);
    4 fin.close();
    5 String s = new String(bytes, "UTF-8")

        所以如果你对文本读操作之前要明白文本编码集,你才能进行正确的解码操作。

        

  • 相关阅读:
    css的三种特性
    css选择器
    margin:0 auto 与 text-align:center 的区别
    JS如何实现点击页面内任意的链接均加参数跳转
    css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version=)
    移动端页面前端设计随笔整理
    理解:Before和:After伪元素
    时下流行的css3页面纵向滑动效果
    webapp网页调试工具Chrome Devtools
    做手机web半年遇到的问题及解决方法
  • 原文地址:https://www.cnblogs.com/ArtsCrafts/p/python_star.html
Copyright © 2011-2022 走看看