"Ascii"编解码器无法在位置186处对字符u'\u201d'进行编码:序数不在范围内(128)。

3
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标志难道不应该防止这种情况发生吗?

尝试使用以下代码:line = re.sub(ur'%s,' % key.decode('utf8'), ur'%s,' % value.decode('utf8'), line.decode('utf-8'), flags=re.UNICODE).encode("utf8")。重点是需要将所有内容转换为Unicode格式。我猜这是Python 2,对吗? - Wiktor Stribiżew
是的,我正在使用Python 2.7。尽管我在使用您的更改时仍然遇到错误。 - Dave L
请发布您的值的内容,尤其是 keyvalue。您使用什么编码? - Wiktor Stribiżew
2
如果 line 已经是 Unicode,则会出现该错误。请检查 type(line) 并可能删除 .decode('utf8') - Mark Tolonen
2个回答

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演示


很不幸,我仍然遇到这些错误。我想键和值都是100%的ASCII /字母数字字符,但当运行到我想保留原样的文本时,它似乎会出现这种情况。 - Dave L
如果keyvalue是ASCII,您可以使用line = re.sub(ur'%s,' % key, ur'%s,' % value, line.decode('utf-8'), flags=re.UNICODE).encode("utf8")(http://ideone.com/D7dpJn)。如果不起作用,请提供一个MVCE(http://stackoverflow.com/help/mcve)。 - Wiktor Stribiżew

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不会进行隐式编码/解码,因此更容易捕获这些错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接