'ascii'编解码器不能对位置186中的字符u'\ u201d'进行编码:序数不在范围内(128)

时间:2015-10-19 19:05:05

标签: python regex python-2.7 unicode

for key, value in supportProjectDict.iteritems():
        line = re.sub(r'%s,' % key, r'%s,' % value, line.decode('utf-8'), flags=re.UNICODE)

尝试通过将字典中找到的任何键替换为相应的值来进行正则表达式替换,但一旦遇到非ASCII字符就会出现此错误:

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

不应该使用re.UNICODE标志来防止这种情况吗?

2 个答案:

答案 0 :(得分:0)

每次使用变量时都需要使用.decode('utf8').encode("utf8")结果和所有字符串都应该作为Unicode字符串传递:

line = re.sub(ur'%s,' % key.decode('utf8'), ur'%s,' % value.decode('utf8'), line.decode('utf8'), flags=re.UNICODE).encode("utf8")

请参阅IDEONE demo

答案 1 :(得分:0)

这很有效。我使用了明确的非ASCII字符串进行测试:

#!python2
#coding:utf8
import re

supportProjectDict = {u'名字':u'马克'} # Note Unicode strings
line = '名字, 有空吗?'                # Note NOT Unicode string.
for key, value in supportProjectDict.iteritems():
        line = re.sub(r'%s,' % key, r'%s,' % value, line.decode('utf-8'), flags=re.UNICODE)
print line

最好在所有地方使用Unicode:

#!python2
#coding:utf8
import re

supportProjectDict = {u'名字':u'马克'}
line = u'名字, 有空吗?'
for key, value in supportProjectDict.iteritems():
        line = re.sub(ur'%s,' % key, ur'%s,' % value, line, flags=re.UNICODE)
print line

格式字符串在这个实例中并不重要,因为它们是ASCII,而Python 2将.decode('ascii')隐式地转换为Unicode字符串,但最好是明确的。仅供参考,Python 3不进行隐式编码/解码,因此更容易捕获这些错误。