python中的编码问题解决方法

在py2.7的项目中用了__future__模块中的 unicode_literals 来为兼容py3.x做准备,今天遇到一个UnicodeEncodeError的错误,跟了下,发现这个小坑值得注意。是怎么样的一个坑呢?跟着代码看看。顺便深究一下原理。
1. 未引入unicode_literals版本

 代码如下 复制代码

#coding:utf-8
from datetime import datetime

now = datetime.now()
print now.strftime('%m月%d日 %H:%M')

这段代码可以正常执行输出: 03月12日 21:53
2. 引入unicode_literals

 代码如下 复制代码

#coding:utf-8
from __future__ import unicode_literals
from datetime import datetime

now = datetime.now()
print now.strftime('%m月%d日 %H:%M')

抛出如下错误:

Traceback (most recent call last):
File "unicode_error_demo2.py", line 7, in <module>
      print now.strftime('%m月%d日 %H:%M')
UnicodeEncodeError: 'ascii' codec can't encode character u'u6708' in position 2: ordinal not in range(128)

3. 解决方案一:设置运行时编码为utf-8

 代码如下 复制代码

#coding:utf-8
from __future__ import unicode_literals
import sys
from datetime import datetime

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

now = datetime.now()
print now.strftime('%m月%d日 %H:%M')

正常执行

4. 解决方案二: 使用byte string

 代码如下 复制代码

#coding:utf-8
from __future__ import unicode_literals
from datetime import datetime

now = datetime.now()
print now.strftime(b'%m月%d日 %H:%M')  # 指明为bytearray字符串

# 或者这样也行
t = bytearray('%m月 %d %H:%M', 'utf-8')
print now.strftime(str(t))

时间: 2024-10-23 02:40:11

python中的编码问题解决方法的相关文章

web.py在SAE中的Session问题解决方法

  这篇文章主要介绍了web.py在SAE中的Session问题解决方法(使用mysql存储),本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下 这段时间一直想尝试着在SAE中使用Python,初步选择了Web.py框架做为开发框架,但是可怜SAE上的资料少的可怜,有点问题基本上解决不了,今天解决一个Session在Session的存储问题,在SAE中不能直接用本地文件存储,好像是权限的原因,我现在采用的是保存在mysql中,效果也不错.希望对大家有帮助.直接上代码了. index

python中base64加密解密方法实例分析

  本文实例讲述了python中base64加密解密方法.分享给大家供大家参考.具体分析如下: 一.base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同.编码

Python中字符集编码和文件读写实现程序

python中默认编码是ASCII,可以通过以下方式设置和获取: import sys print sys.getdefaultencoding() sys.setdefaultencoding('gbk')但直到python重新启动后新的默认编码才会生效,我试了一下,setdefaultencoding总是会出错,没有这个属性.用dir看,确实没有,python版本是2.5,不知道是否被取消了. 使用print来输出时,python将内容传递给系统处理,windows会按照系统默认编码来输出.

Python中操作时间之strptime()方法的使用

  这篇文章主要介绍了在Python中操作时间之strptime()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 strptime()方法分析表示根据格式的时间字符串.返回值是一个struct_time所返回gmtime()或localtime(). 格式参数使用相同的指令使用strftime();它默认为"%a %b %d %H:%M:%S %Y"相匹配的ctime()所返回的格式. 如果字符串不能按格式进行解析,或者如果它具有解析后多余的数据,ValueEr

在Python中操作时间之tzset()方法的使用教程

  这篇文章主要介绍了在Python中操作时间之tzset()方法的使用教程,是Python学习中的基础知识,需要的朋友可以参考下 tzset()方法重置所使用的库例程的时间转换规则.环境变量TZ指定如何完成此操作. TZ环境变量的标准格式(空格为清楚起见而加的): 代码如下: std offset [dst [offset [,start[/time], end[/time]]]] std和dst: 三个或更多的字母数字给人的时区缩写.这些将被传播到time.tzname. offset: 偏

Python中使用partial改变方法默认参数实例

  这篇文章主要介绍了Python中使用partial改变方法默认参数实例,本文直接给出使用实例,代码中包含详细注释,需要的朋友可以参考下 Python 标准库中 functools库中有很多对方法很有有操作的封装,partial Objects就是其中之一,他是对方法参数默认值的修改. 下面就看下简单的应用测试. 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- #python2.7x #partial.py #authror: orang

Python中的对象,方法,类,实例,函数用法分析_python

本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. 复制代码 代码如下: class Foo(object):     static_attr = True     def method(self):         pass foo = Foo() 这段代码实际上创造了两个对象,Foo和foo.而Foo同时又是一个类,foo是这个类的实例. 在C++里类型定义是在编

python 中的urllib2.urlopen()方法

问题描述 python 中的urllib2.urlopen()方法 python中,urllib2中的urlopen()方法可以这样用: response=urllib2.urlopen("http://www.baidu.com") html=response.read() 也可以这样用:先创建一个Request对象 request=urllib2.Request("http://www.baidu.com") response=urllib2.urlopen(r

ajax调用中ie缓存问题解决方法_AJAX相关

本文实例分析了ajax调用中ie缓存问题解决方法.分享给大家供大家参考,具体如下: ajax请求调用的过程中发现的问题:后台请求是一个简单的.aspx文件,而这个页面又没有考虑过缓存的影响,使用ajax调试的时候发现有时候根本不走后台代码直接返回结果了,所以估计是受到浏览器缓存的影响.网上搜了一下,果然是缓存的问题:"IE中如果XMLHttpRequest提交的URL与历史一样则使用缓存,根本不向服务器端提交.因此无法取到刚提交的数据或新的数据". 解决方法大致有下面几种: 1.只改进