zoukankan      html  css  js  c++  java
  • python 编码小结

    str VS unicode

    python中有两种类型的字符串,分别是str和unicode,其中str是字符串的某种编码的字节流,unicode类型的字符串用的是UCS-2编码。

    默认编码

    python2的默认编码为ASCII。可以通过sys.getdefaultencoding()得到。当没有编码声明时就会用默认编码来解码源文件中的str类型字符串。

    源文件编码VS编码声明

    python源文件的头部声明源文件的编码格式,如#coding:utf-8。python中的源文件编码最好和编码声明一致,否则会出现解码错误。

    1 #coding:uft-8
    2 
    3 s = u"中国"

    将上面的代码保存成gbk格式的.py文件,执行后会出现如下的错误:

    python会用声明的编码去解码代码中的str类型字符串,比如执行到s=u"中国"时,此时的"中国"是一个str类型字符串,内容为"0xd6 0xd0 0xb9 0xfa",也就是“中国”的gbk编码,用utf-8解析时就会不认识0xd6,导致编码错误。

    文件编码是str类型的真正的编码格式,而python是用声明的编码来解码str类型的,所以导致了错误。

    写文件相关编码

    如果想将unicode字符串写入文件会发生什么情况呢?

    1 #!/usr/bin/python
    2 #coding:utf-8
    3 import sys
    4 s = u"中国"
    5 
    6 f = open("test.txt", "w")
    7 f.write(s)
    8 f.close()

    将以上代码以utf-8格式保存为test.py

    在windows的console运行后出现

    可见写文件时还是用ascii来编码s的, 该编码其实就是f.encoding,如果f.encoding为None则使用默认编码,即ascii。

    同理print也是写文件,当执行print u"中国"时,采用的是sys.stdout.encoding来编码unicode字符串

    python标准库中的函数返回的字符串的编码

    python标准函数(非unicode版本)返回的字符串的编码是由操作系统设置决定的,在我的中文window7中返回的是GBK编码,英文linux中返回的是utf-8编码。该编码应该是和locale.getdefaultlocale()一致的。

    string与unicode的转换

    可以通过 unicode(string[, encoding, errors])来将string转为unicode字符串,string必须是str类型的字符串,encoding指明了string所用的编码,默认为ascii。所以,unicode("中国")会报错,因为ascii不能解码"中国",必须用encoding指定"中国"所用的编码。

    1 #!/usr/bin/python
    2 #coding:utf-8
    3 import sys
    4 us = u"中国"
    5 s = "中国"
    6 s1 = us + s

    如上代码保存为utf-8格式后,运行会报错,原因是执行到第6行时会将s转为unicode,相当于调用了unicode(s),而不是unicode(s, "utf-8")。而u"中国"却是相当于调用了unicode(s, "utf-8"),有点奇怪。。。

    raw string and unicode string

    当字符串中有转义字符时,可以使用r前缀取消转义属性,此时字符串被称为raw string 如r"\t"相当于"\\t",需要注意的是r前缀和字符串之前不得有其他前缀,如ru"\t"这样的写法是错的,必须写成ur"\t"。

    我们可以用u"\u0031"的方式来表示u"1",\u后面加一个code point表示一个unicode字符,如果写成ur"\u0031",则r前缀将不起作用,起作用的是u。写成r"\u0031"则会起到raw string的作用。

    读文件

    用python读文本文件时,会将文本文件的字节依次读出来。将此字节流输出到console时有可能产生乱码,原因是console用来解析该字节流的编码与该字节流真正的编码不兼容。

    比如将一个utf-8格式的文本文件中字节流输出到windows的console就有可能产生乱码,因为中文版win7的console的默认代码页是cp936,也就是GBK编码,用GBK编码解析utf-8格式的编码当然有可能出错啦。但是GBK是和ASCII兼容的,而且utf-8也是和ASCII字符兼容的。如果utf-8字节流中只有ascii字符,此时输出到console便不会有乱码了。如果utf-8字节流中有含有中文,则用gbk解析的时候就会解析成乱码。

    xml为了解决文本文件的编码问题,便在文件头部就指明了该文件所用的编码。

  • 相关阅读:
    kettle 连接 SQL Server 异常
    Quartz.NET
    过滤器和拦截器
    Spring Web MVC(一)
    Spring(三)之自动装配、表达式
    spring(四)之基于注解(Annotation-based)的配置.md
    Spring(一)之IOC、bean、注入
    Spring(二)之配置.md
    cookie和session详解
    jsp基础与提高(EL、JSTL)
  • 原文地址:https://www.cnblogs.com/xueguangfeng/p/python_read_file_encoding.html
Copyright © 2011-2022 走看看