zoukankan      html  css  js  c++  java
  • Python 2.7 学习笔记 中文处理

    首先我们在编写python代码文件时,文件本身会采用一种编码格式,如 utf-8 或 gbk

    这时我们需要在python文件的开头设置文件的编码格式,以告诉编译器。

    如果文件的编码格式是 utf-8, 则在文件的第一行需要添加如下语句

    #coding=utf-8

    如果文件的编码格式是 gbk, 则在文件的第一行需要添加如下语句

    #coding=gbk

    如果设置为utf-8的格式,在linux执行,中文处理,包括显示没任何问题。

    但是如果设置为utf-8的格式,在window下,在命令行下执行时,发现利用 print打印中文会出现乱码。

    原因是因为,虽然文件声明为utf-8,且用utf-8的编码保存的源文件。但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串就显示乱码了。 注意,实际上只是显示有问题,入库等处理并没问题。

    这有两种解决方案。

    一、方案一:

    将文件的编码格式改为gbk,并在文件的第一行改为#coding=gbk,这时处理中文就没问题。

    但这个方案带来的问题,如果该文件放到Linux下可能会显示出问题。因为一般linux机器下没有gbk的字符集。

    二、方案二

    文件还是采用utf-8的编码,文件头的第一行依然是#coding=utf-8

    这时在print 中文时需要进行下编码,代码如:

    print "中文".decode('utf-8').encode(sys.getfilesystemencoding())

    注意:因为用到了sys模块,需要在语句执行添加 import sys

    这样带来的问题,print语句比较臃肿,可以考虑自己封装下.

    三、关于 decode 方法和 encode 方法

    字符串在Python内部的表示是unicode编码。在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 

    decode的作用是将其他编码的字符串转换成unicode编码, 其参数就是字符串的当前编码格式。如str.decode('utf-8'),表示将utf-8编码的字符串转换成unicode编码。 

    encode的作用是将unicode编码转换成其他编码的字符串, 其参数就是希望转换后的编码格式。如str.encode('utf-8'),表示将unicode编码的字符串转换成utf-8编码。

    不能直接将一种编码(非unicode)的字符串利用encode方法直接转换为其它的编码格式。

     注意:unicode 和 其它的编码字符串在python 是完全不同的两种数据类型,unicode的字符串时unicode类型的, 其它的是str类型。

    在python中,对于字面字符串我们可以在字面字符串前加u把该字符串声明为unicode类型的。

    下面我们来看一个例子了解unicode和str类型的区别

    >>> s='测试'
    >>> us=u'测试unicode'
    >>> print isinstance(s,str)
    True
    >>> print isinstance(s,unicode)
    False
    >>> print isinstance(us,str)
    False
    >>> print isinstance(us,unicode)
    True
    >>> print isinstance(us.encode('utf-8'),unicode)
    False
    >>> print isinstance(us.encode('utf-8'),str)
    True
    >>> print isinstance(s.decode('gbk'),unicode) #是在windows下执行,默认的s是gbk编码
    True


    利用第三方包  chardet的detect方法可以检查一个字符串具体的编码格式,如:

    >>> import chardet
    >>> chardet.detect('中文')
    {'confidence': 0.682639754276994, 'encoding': 'KOI8-R'} #在window下执行的
    >>> chardet.detect('str123')
    {'confidence': 1.0, 'encoding': 'ascii'}
    >>> chardet.detect(u'中文')   #无法对unicode类型进行检查
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:Anaconda2libsite-packageschardet\__init__.py", line 25, in de
        raise ValueError('Expected a bytes object, not a unicode object')
    ValueError: Expected a bytes object, not a unicode object
    >>> chardet.detect(u'中文'.encode('utf8'))  #参数为utf-8的
    {'confidence': 0.7525, 'encoding': 'utf-8'}

    四、与中文相关的常见处理场景

    在程序编写中,一般涉及到中文我们才需要编解码。 通常有如下几种场景:

    1、将文件中硬编码的中文字符串利用print输出,就如上面介绍的例子:

    str = "中文"

    print  str

    str = str.decode('utf-8').encode(sys.getfilesystemencoding())

    print str

    上面的代码假设文件的编码格式为utf-8,当在windows命令行下执行时,第一个print语句输出的是乱码。

    我们先调用decode方法将其转为 unicode编码,然后在调用encode方法转为系统编码的格式。

    2、当我们用raw_input从控制台获取字符串时

    这时获取到的字符串的编码时系统编码,不一定是utf-8,这时我们想要转为utf-8,可以用如下的方法

    msg = raw_input(">")
    msg = msg.decode(sys.getfilesystemencoding()).encode('utf-8')

    上面代码先将字符串解码成unicode编码,再编码成utf-8

    3、列表或字典中的中文处理

    data = {"a":"hello","b":"中国"}  #假设是utf-8的格式

    这时我们用print直接输出data, 或用str函数将data转为字符串。其中的中文是变成unicode的字符,如:

    >>> data = {"a":"hello","b":"中国"}
    >>> print data
    {'a': 'hello', 'b': 'xd6xd0xb9xfa'}

    单独输出中文字段没问题,如

    >>> print data['b']
    中国

    如果希望能正常的将整个字典输出,可以利用json包的dump方法,如:

    >>> data = {"a":"hello","b":"中国"}
    >>> s = json.dumps(data,ensure_ascii=False);
    >>> print s
    {"a": "hello", "b": "中国"}

    >>> print isinstance(s,str)
    True

    4、当我们利用os的相关方法时,传入的字符串编码需要与系统一致,如:

    filename = "D:/测试.txt";  # 假设是utf-8的格式

    filename = filename.decode("utf-8").encode(sys.getfilesystemencoding()); #转为当前系统字符集

    re = os.path.exists(filename)  # 检查文件是否存在,必须要上面的先转换为当前系统字符集才会正确

    filename = filename.decode(sys.getfilesystemencoding()).encode("utf-8"); #重新转为utf-8

      

  • 相关阅读:
    解决ios下iframe不能滑动
    每天一题之js执行顺序
    async函数的返回值
    小程序自定义Tabbar
    windows10配置vue3项目踩坑记录
    vue2+循环链表解决一个历史趣题
    小程序内协议使用的三种方法
    HDFS的java操作
    HDFS工作原理笔记
    win10已经编译好的hadoop2.6.5
  • 原文地址:https://www.cnblogs.com/51kata/p/5339448.html
Copyright © 2011-2022 走看看