• python编码问题


    1.str

    str是字节数组,里面存放的是unicode经过编码(可以是gbk、utf8、anscii等等)之后的字节序列。系统需要根据sys中的默认编码方式对str进行decode为unicode,可以通过sys.getdefaultencoding()活得系统默认编码方式。也可以根据sys.setdefaultencoding('gbk')更改默认编码方式。一般默认编码是anscii

    至于reload(sys)是因为Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入

    字节序str是一切编码之后的存储方式。unicode是最基本的源码,其他码都是从unicode基础上编码成字节序列的。

    2.IO操作

    IO操作例如:

    open("Test.txt").read()是根据文件的编码(将文本编码成字节序列存放)然后读取的字节序列。字节序列即 str,要译码成unicode,需要按照原来文件的编码。

    有BOM(编码格式,3个字节)的需要去掉BOM再读取内容,否则会出错:

    # coding=gbk

    import codecs

    data = open("Test.txt").read()

    if data[:3] == codecs.BOM_UTF8:

    data = data[3:]

    print data.decode("utf-8")

    结果:abc中文

    3.print控制台的输出

    print语句它的实现是将要输出的内容传送到操作系统,操作系统会根据系统的编码(sys.getdefaultencoding())对输入的字节流进行译码显示。

    4.python源文件.py中定义的编码声明

    通常在py文件开头定义:

    #!/usr/bin/env python
    #coding=utf-8

    源文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如

    test.py文件中有

    str = '哈哈'

    print repr(str)

     

    a.如果文件格式为utf-8,则str的值为:'xe5x93x88xe5x93x88'(哈哈的utf-8编码)

    b.如果文件格式为gbk,则str的值为:'xb9xfexb9xfe'(哈哈的gbk编码)

    5.中文处理过程

    1)来源:

    文件IO读入:是将中文字符按照文件格式编码成字节序列,存放起来。读取的时候读的字节序列。

    *.py程序中直接赋值为中文字符串:中文字符串也会编码encoding并按照字节序列存入堆栈变量。这个encoding是根据*.py源文件的#coding=encoding 来确认编码方式的。

    其实源文件自己保存时还有一个编码格式,因为代码自身也是一个字节序列存放的,类似于文本。此处称为文件文本格式编码。因此*.py程序中的中文首先是按照文件文本格式编码成字节序列。然后解释器会load该源文件的字节序列并解释成二进制代码。

    例如 test.py文件文本格式为utf-8

    #!/usr/bin/env python
    #coding=gbk

    ss = u'哈哈'

    print repr(ss)

    print 'ss:%s' % ss

     

    a)test.py文件文本格式为utf-8,存放时时将 '哈哈'存成utf-8的字节序:'xe5x93x88xe5x93x88'

    b)解释器读取是读的字节序:'xe5x93x88xe5x93x88'

    c)ss= u'哈哈' ,解释器将字节序列'xe5x93x88xe5x93x88'按照.py中声明的coding方式(此处为gbk)进行译码为unicode:u'u935du581du6431'

    d)print repr(ss)输出的是u'u935du581du6431'

    6.unicode是一种类型,不同于字节,它其实是占两个字节

    >>> b = 'xe5x93x88xe5x93x88'.decode('gbk')
    >>> b
    u'u935du581du6431'
    >>> b[0]
    u'u935d'
    >>> len(b)
    3
    >>> type(b[0])
    <type 'unicode'>

    unicode与文件IO、控制台交互时都是要先按照其他编码方式编码成字节流的,否则会出错。

    7.字节数组str是一种类型,每个元素占一个字节

    >>> a = 'xe5x93x88xe5x93x88'
    >>> a
    'xe5x93x88xe5x93x88'
    >>> len(a)
    6
    >>> a[0]
    'xe5'
    >>> type(a[0])
    <type 'str'>

  • 相关阅读:
    一些有用的DNN方法
    将VB.Net反编译时StringType.StrCmp用C#中的函数string.Compare替换
    接一个DNN安装时的未知错误,终于找到了原因
    这是用performancing for firefox编写的blog
    这是用word2007发表的blog
    一个DNN安装时的未知错误
    后端——框架——切面框架——aop——Pointcut表达式
    Metroid Prime Chs 20101004
    第一财经周刊:书店的黄昏
    这年头连萝卜都靠不住了
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/3546762.html
Copyright © 2020-2023  润新知