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

      

  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/51kata/p/5339448.html
Copyright © 2011-2022 走看看