我试图创建一个包含多个带有特殊字符的字符串的新字符串。这不起作用:
# -*- coding: utf-8 -*-
str1 = "I am"
str2 = "español"
str3 = "%s %s %s" % (str1, u'–', str2)
print str3
>> Traceback (most recent call last):
File "myscript.py", line 5, in <module>
str3 = "%s %s %s" % (str1, u'–', str2)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
奇怪的是,如果删除ñ
或–
字符,它会正确创建字符串:
# -*- coding: utf-8 -*-
str1 = "I am"
str2 = "espaol"
str3 = "%s %s %s" % (str1, u'–', str2)
print str3
>> I am – espaol
或:
# -*- coding: utf-8 -*-
str1 = "I am"
str2 = "español"
str3 = "%s %s" % (str1, str2)
print str3
>> I am español
它出了什么问题?
答案 0 :(得分:1)
您正在混合Unicode字符串和字节字符串。 不要那样做。确保所有字符串都是相同的类型。最好是unicode
。
混合str
和unicode
时,Python 隐式将使用ASCII编解码器对一种或另一种类型进行解码或编码。避免通过显式编码或解码进行隐式操作,以使所有类型都成为一种类型。
这是导致UnicodeDecodeError
例外的原因;您混合了两个str
个对象(字节字符串,str1
和str3
),但只有str1
可以解码为ASCII。 str3
包含UTF-8数据,因此解码失败。明确创建unicode
字符串或解码数据会使事情有效:
str1 = u"I am" # Unicode strings
str2 = u"español" # Unicode strings
str3 = u"%s %s %s" % (str1, u'–', str2)
print str3
或
str1 = "I am"
str2 = "español"
str3 = u"%s %s %s" % (str1.decode('utf-8'), u'–', str2.decode('utf-8'))
print str3
请注意,我也使用Unicode字符串文字作为格式化字符串!
你真的应该阅读Unicode,编解码器和Python。我强烈推荐以下文章: