同事在工作中遇到一个字符编码的问题;问题是:从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. 如何精确地测量java对象的大小-底层instrument API

    转载: 如何精确地测量java对象的大小-底层instrument API 关于java对象的大小测量,网上有很多例子,大多数是申请一个对象后开始做GC,后对比前后的大小,不过这样,虽然说这样测量对象 ...

  2. node环境下处理get post

    前言:今天刚学get,post.这里只是几下今天的理解.so文章只供新手参考. 编译器是webstorm 搭建后服务器后(具体请查看上篇文章) 在routes文件夹下的index.js文件中写入 如图 ...

  3. canvas调节视频颜色

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. hdu----(2848)Repository(trie树变形)

    Repository Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. 你不知道的JavaScript--值得你挑战的JavaScript面试题(45题)

    1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2&qu ...

  6. Struts、JSTL标签库的基本使用方法

    一 使用Struts标签之前需要经过下面3个步骤的配置. 1.导入TLD文件. 2.在web.xml中注册标签库. 3.在页面中引入标签库. 下面详细介绍以上步骤. 1 导入TLD文件. TLD文件是 ...

  7. Linux Bash代码 利用for循环实现命令的多次执行

    Linux Bash代码 [yuanhao15@lu01 libsvm-rank-2.81]$ for ((i=0; i<=19; i++)) do ./svm-train -s 5 -c 10 ...

  8. JavaScrip的DOM操作(13号讲)

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型,文档是指标签文档:对象是指文档中每个元素:模型是指抽象化的东西 2.Windows对象操作 一.属性和方法 二.Window.open(& ...

  9. Sui 弹框固定

    SUI是一套基于bootstrap开发的前端组件库,同时它也是一套设计规范,可以非常方便的设计和实现精美的页面,是一个简单易用.功能强大的UI库.自己在使用sui过程之中,总是忘记它的一些Api,今天 ...

  10. 如何为Kafka集群选择合适的Partitions数量

    转载:http://blog.csdn.net/odailidong/article/details/52571901 这是许多kafka使用者经常会问到的一个问题.本文的目的是介绍与本问题相关的一些 ...