zoukankan      html  css  js  c++  java
  • Python-编码之大彻大悟

    1.了解各种编码的来历及其在计算机内部的存储:

      http://www.cnblogs.com/JohnABC/p/3507219.html

      http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

      http://www.ruanyifeng.com/blog/2014/12/unicode.html

    2.了解二进制文件和文本文件的区别: http://www.cnblogs.com/JohnABC/p/3478134.html

    3.了解Python的Unicode和Str编码: http://www.cnblogs.com/JohnABC/p/4015504.html

    4.在Python中正确使用Unicode: http://www.cnblogs.com/JohnABC/p/4257574.html

    根据以上几篇文章总结以下要点:

    0.转码时通常以unicode作为中间码, 先将其它编码的祖父次解码成unicode, 再从unicode编码成另一种编码。(string-uicode, bytes-str)

    1.str和unicode都是basestring的子类, 严格意义上说, str对象其实是字节串, 它是unicode经过编码后的字节组成的序列, 实际是"8-bit-string", 字节字符串, 类似Java中的byte[], unicode对象等同于Java中的String对象, 本质上是Java的char[]

    2.对 UTF-8编码的str'汉'使用len()函数时, 结果是3, 因为实际上, UTF-8编码的'汉' == 'xE6xB1x89'

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

    4.repr()和``做的是完全一样的事情, 它们返回的是一个对象的“官方”字符串表示, 也就是说绝大多数情况下可以通过求值运算(使用内建函数 eval())重新得到该对象, 但str()则有所不同, str()致力于生成一个对象的可读性好的字符串表示, 它的返回结果通常无法用于eval()求值, 但很适合用于print语句输出, 需要再次提醒的是, 并不是所有repr()返回的字符串都能够用eval()内建函数得到原来的对象

    5.如果文件是UTF-8编码的, 则以下会报错。因为文件是UTF-8编码的, 所以'你好'是UTF-8编码的, 用gb2312转成unicode是不可能的。

    s = "你好"
    s.decode("gb2312").encode("utf-8")
    
    #UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3:illegal multibyte sequence

    6.获得系统的默认编码

    #!/usr/bin/env python
    #coding=utf-8
    
    import sys
    print sys.getdefaultencoding()

    a

    u = u''
    print repr(u) # u'u6c49'
    s = u.encode('UTF-8')
    print repr(s) # 'xe6xb1x89'
    u2 = s.decode('UTF-8')
    print repr(u2) # u'u6c49'

    5.使用原则

    • 所有文本字符串都应该是unicode类型,而不是str类型。如果处理的是文本,而变量类型是str,这就是bug了!
    • 若要将字节串解码成字符串,需要使用正确的解码,即var.decode(encoding)(如,var.decode('utf-8'))。将文本字符串编码成字节,使用var.encode(encoding)。
    • 永远不要对unicode字符串使用str(),也不要在不指定编码的情况下就对字节串使用unicode()
    • 当应用从外部读取数据时,应将其视为字节串,即str类型的,接着调用.decode()将其解释成文本。同样,在将文本发送到外部时,总是对文本调用.encode()
    • 如果代码中使用字符串字面值来表示文本,总是应该含有’u'前缀。但实际上,永远不要在代码中定义原始的字符串字面值。不管怎样,我自己是很讨厌这一条,也许其他人也和我一样吧。
  • 相关阅读:
    java扫描文件夹下面的所有文件(递归与非递归实现)
    JAVA8 十大新特性详解
    Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目
    Spring官网下载各版本jar包
    史上最全Java面试题(带全部答案)
    深入JVM对象引用
    23种设计模式全解析
    git difftool和mergetool图形化
    Java技术——你真的了解String类的intern()方法吗
    动手实现一个vue中的模态对话框组件
  • 原文地址:https://www.cnblogs.com/JohnABC/p/4257580.html
Copyright © 2011-2022 走看看