UnicodeEncodeError in Python2.7

原创
2015/03/04 14:38
阅读数 70

每次使用python时总是在python3环境中开发,最近用了一下python2就遇到了一个问题

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0303' in position 0: ordinal not in range(128)

常见的Unicode错误;

先谈一下raise的原因,最近一直的开发一个 omml(Office Math Markup Language)转latex的lib:dwml

其module latex_dict 里是一些omml字符和latex符号的对应,我使用了python的unicode字符表示

这里先推荐看一下这篇文章https://docs.python.org/3/howto/unicode.html 就能明白,python2中字符串是有两种类型的一种是 str (默认编码是ascii) 和 unicode ,

这样dwml中xml解析出来的字符混杂了unicode和str类型的字符串,当使用format(),str()时python2会将unicode类型的字符传 转为 str类型的字符串

但ascii只有一个字节(0~127) 无法描述这些unicode 这样就出现了上面的错误;

那么解决问题就很显然了,所有使用字符串的地方都转为unicode类型幸好python提供了一个unicode()函数,我们做这件事情也很容易

由于unicode在python3里是没有的,所我加了这个函数来处理

def module_to_unicode(module,charset='utf-8'):
	"""
	Convert latex_dict module attrs to unicode attrs in Python2.x
	"""
	attrs = module.__dict__
	for n in dir(module):
		if n[0:2] == '__':
			continue
		if isinstance(attrs[n],str):
			attrs[n] = unicode(attrs[n],charset)			
		elif isinstance(attrs[n],dict):
			new_dict = dict()
			for k in attrs[n]:
				k = k if isinstance(k,unicode) else unicode(k,'utf-8')				
				new_dict[k]  = unicode(attrs[n][k],charset)
			attrs[n] = new_dict
		elif isinstance(attrs[n] ,list):
			new_list = list()
			for v in attrs[n]:
				new_list.append(unicode(v,charset))
			attrs[n] = new_list



module_to_unicode(latex_dict)
在python2环境下,将这个模块下的所有字符串都转为unicode类型,问题就解决了

PS:也可以都encode('utf-8')到byte,这也是一种解决方案

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部