同事在工作中遇到一个字符编码的问题;问题是:从mysql数据库中读出来的varchar类型数据在python是unicode类型的。

但他却对这个unicode字符进行了decode,因为他以为读出来的是utf-8(python中的str类型)。程序中报错了。

但比较奇怪的是,另一个大神同事也做了同样的事情,却没有报错。细细比较代码起来,发现没出错的同事的代码中多了一行

reload(sys)
sys.setdefaultencoding('utf-8')

个人猜测,当python在做decode操作的时候,比如a.decode('utf-8'),如果a不是utf-8类型的,python会自动的试着去将a先转化为utf-8,然后在进行decode;

同样,当python在做encode操作的时候,比如a.encode('utf-8'),如果a不是unicode类型的,python会自动的试着去将a先转化为uncode类型的,然后再进行encode

而python在自己自动转化的时候会用什么作为转码标准呢,就是用 defaultencoding里面的编码作为转码标准;

下面的代码能说明一些这样的问题:

#coding:utf-8
import sys

a = '中文'
print type(a)

b = u'中文'
print type(b)

reload(sys)
sys.setdefaultencoding('ascii')

#print a.encode('gb18030')
#这个时候报错信息是
#UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

#print b.decode('utf-8')
# 这个时候的报错信息是
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

reload(sys)
sys.setdefaultencoding('utf-8')

print a.encode('gb18030')

#这个时候是没问题的。

print b.decode('utf-8')

#这个时候也是没问题的。

python字符decode与encode的问题的更多相关文章

  1. python中decode和encode的区别

    #-*-coding:utf-8 import sys ''' *首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码, 即先将 ...

  2. python 补充-decode和encode

    1. decode与encode转码 在Python3中默认编码就是uncode,encode转成Byte类型 在Python2中默认编码就是ascii window下默认编码是GBK decode( ...

  3. python之decode、encode及codecs模块

    一.先说说编解码问题 编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码. Eg: str ...

  4. Python中decode与encode的区别

    摘抄: 字符串在Python内部的表示是Unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符解码(decode)成unicode,再从unicode编码 ...

  5. Python编码decode和encode

    常见编码介绍: GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换;GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码ASCII编码:是对 ...

  6. codecs模块, decode、encode

    使用codecs模块,在Python中完成字符编码   字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法.从单字节到多字节叫做decoding,从多字节到单字节叫做encodin ...

  7. 关于Python字符编码encode和decode

    (注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 记得几天前,部门的一个小姑娘问我,怎么她Python打印出来的中文信息都乱码了?我走过去,略思一二,瞬间给她搞定,其实这是字 ...

  8. 【python】浅谈encode和decode

    对于encode和decode,笔者也是根据自己的理解,有不对的地方还请多多指点. 编码的理解: 1.编码:utf-8,utf-16,gbk,gb2312,gb18030等,编码为了便于理解,可以把它 ...

  9. python编码问题 decode与encode

    参考: http://www.jb51.net/article/17560.htm 如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCI ...

随机推荐

  1. Rest接口中正则表达式

    匹配所有字符: @Path("/server/{urlParam: .*}")

  2. Java 基础知识点(必知必会其一)

    如何将字符串转换为数字? package Day_2; /** * @author Administrator * 功能: 如何将字符串转换为数字? */ public class StringToI ...

  3. 新建txt文件新增内容并打印出

    #!/usr/bin/python import os file1=open("C:\Python34\ceshi.txt","a+");  #a+开一个文件用 ...

  4. 20145236 《Java程序设计》 第6周学习总结

    20145236 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 InputStream与OutputStream 串流设计的概念 Java将输入/输出抽象化为串 ...

  5. template模版与Underscore.js

    template模版与Underscore.js 在项目中经常使用的模版是Underscore这个js框架的实用功能. 在html里面设定模板,然后js绑定数据,这样能避免在js中出现非常多的html ...

  6. JFrame背景

    1.引言 在了解了JFrame面板的相关知识后,我们可以选择在RootPane根面板或LayeredPane面板中设置背景图案. 2.方法 对于大小固定的窗口背景设置如下: //导入图案 ImageI ...

  7. uva 1220

    1220 - Party at Hali-Bula Time limit: 3.000 seconds Dear Contestant, I'm going to have a party at my ...

  8. 《Play for Java》学习笔记(六)文件上传file upload

    一. Play中标准方法 使用表单form和multipart/form-data的content-type类型. 1.Form @form(action = routes.Application.u ...

  9. Android TextView标签的显示

    在默认情况下,如果一个TextView中的文字太多,会跨行显示, 通过下面两个参数的设置,可以使TextView固定显示一行,未显示完成的后面用...... android:maxLines=&quo ...

  10. Android WebView的使用

    WebView是View的一个子类,使用它可以在App中嵌入H5页面,可以跟js互相调用. webview有两个方法:setWebChromeClient和setWebClient setWebCli ...