zoukankan      html  css  js  c++  java
  • python中unicode、utf8、gbk等编码问题

    概要:编码转换无疑是程序开发过程中常遇到而且很让人头疼的问题,一旦和数据库交互那就更麻烦了,今天来总结一下 python 中编码转换的方法。

    前一段时间就想写一篇总结Python字符串的文章,但是时间较紧,而且我当时遇到的问题也不是很难,就暂搁下了,今天又被这编码折磨一番,泪奔啊……

    至于unicode、utf8等编码原理以及区别等问题可以去百度百科查看,网上也有介绍,我想说的是直接的转换方法——先知其然,然后再知其所以然吧。

    1.普通字符串与unicode转换

    无论是什么平台什么编码格式都能转换为unicode格式。

    以utf8编码方式把字符串转换为unicode:

    'aaa'.decode('utf8')</pre>等同于<pre class="prettyprint">unicode('aaa', 'utf8')
    

    把unicode字符串转换为utf8编码格式字符串:

    'aaa'.decode('utf8')
    

    注意:这样写已经表示'aaa'是一个unicode格式的字符串了,等同于

    u'aaa'.decode('utf8')
    

    如果全部是英文字符或者数字,则utf8与gbk输出结果一致,而且带不带u都一样

    2.有汉字的字符串

    这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的,伤不起!

    把普通中午字符串转换为unicode:

    '也有'.decode('gbk')
    

    注意:此时字符串前不能加u,而且汉字编码只能写gbk或者gb2312等

    把上面的结果再转成gbk

    print  u'u4e5fu6709'.encode('gbk')
    

    当然unicode可以转成utf8,但是要看你的终端支持什么编码了,要不然就会乱码,我用的WIN,所以就用gbk测试

    如果不用print输出,直接

    u'u4e5fu6709'.encode('gbk')
    

    或者

    u'u4e5fu6709'.encode('utf8')
    

    你会看到这两个汉字在gbk和utf8编码格式下的字符,这里不多研究了(utf8汉字编码比gbk多一个字符)

    下面把运行的结果输出:

    >>>'aaa'.decode('utf8')
    u'aaa'
    >>>unicode('aaa', 'utf8')
    u'aaa'
    >>>'aaa'.decode('utf8')
    u'aaa'
    >>>u'aaa'.decode('utf8')
    u'aaa'
    >>>'也有'.decode('gbk')
    u'u4e5fu6709'
    >>>print  u'u4e5fu6709'.encode('gbk')
    也有
    >>>u'u4e5fu6709'.encode('gbk')
    'xd2xb2xd3xd0'
    >>>u'u4e5fu6709'.encode('utf8')
    'xe4xb9x9fxe6x9cx89'
    

    说明:str()函数,有时候我们要借助它来过度转换,比如u'%E9%95%BF%E6%98%A5%E5%B8%82',这就是我下午遇到的问 题,把urlencode转换的编码经过urldecode解码,结果前面多个u,此时是utf8编码,然后decode成unicode,出问题了:

    >>> s = u'%E9%95%BF%E6%98%A5%E5%B8%82'
    >>> import urllib
    >>> urllib.unquote(s)
    u'xe9x95xbfxe6x98xa5xe5xb8x82'
    >>> urllib.unquote(s).decode('utf8')
    Traceback (most recent call last):
      File "", line 1, in 
      File "D:Python26libencodingsutf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordin
    al not in range(128)
    

    特别注意:utf8编码、gbk编码的原型加上u然后再转unicode是错误写法,肯定转不了,那怎样去掉u呢?str()函数也不能直接转,只好把u'%E9%95%BF%E6%98%A5%E5%B8%82'用str()处理去掉u,然后一切都OK了。

    >>>urllib.unquote(str(s)).decode('utf8')
    u'u957fu6625u5e02'
    >>>print urllib.unquote(str(s)).decode('utf8')
    长春市
    
  • 相关阅读:
    Viusal Studio 2022 正式版安装秘钥
    关于云计算,云存储,和自己开发的云存储的小工具
    网盘工具比较,以及自己开发的网盘工具
    VARIANT及相关类
    关于 BSTR, CComBSTR and _bstr_t
    如何真正发挥Google Docs的威力
    ORM框架EntitysCodeGenerate自定义分页查询及快捷执行SQL(CreateSQL)示例
    关于Java Servlet的中文乱码
    ORM框架VB/C#.Net实体代码生成工具(EntitysCodeGenerate) 【ECG】4.3 介绍
    通用JS验证框架(ChkInputs)概述
  • 原文地址:https://www.cnblogs.com/mmix2009/p/3216164.html
Copyright © 2011-2022 走看看