Python - 不能连接多个非ascii字符串

时间:2017-02-27 08:18:16

标签: python string

我试图创建一个包含多个带有特殊字符的字符串的新字符串。这不起作用:

# -*- 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

它出了什么问题?

1 个答案:

答案 0 :(得分:1)

您正在混合Unicode字符串和字节字符串。 不要那样做。确保所有字符串都是相同的类型。最好是unicode

混合strunicode时,Python 隐式将使用ASCII编解码器对一种或另一种类型进行解码或编码。避免通过显式编码或解码进行隐式操作,以使所有类型都成为一种类型。

这是导致UnicodeDecodeError例外的原因;您混合了两个str个对象(字节字符串,str1str3),但只有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。我强烈推荐以下文章: