由于编码

时间:2018-03-28 07:55:59

标签: python python-3.x encoding character-encoding

我有以下字符串比较,其行为符合预期:

u'release V13.0.0: (Alumin\xadium) improved API' == u"release V13.0.0: (Alumin­ium) improved API"

(请注意,Alumin-ium之间有一个软连字符,在第二个字符串中未显示)

我的问题是如何在使用变量而不是文字字符串时重现此比较,因为使用unicode()具有此输出:

unicode(rows[38][0]) == ("release V13.0.0: (Alumin­ium) improved API")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xad in position 24: ordinal not in range(128)

编辑:第一个字符串来自数据库,第二个字符串来自Gitlab API。

2 个答案:

答案 0 :(得分:0)

这部分:"(Alumin\xadium)"有一个不需要的转义字符,如果原始字符串是python代码,那么它会创建一个不需要的'\xad'转义序列。将其替换为'\\xad',使其成为文字r'\xad'

答案 1 :(得分:0)

似乎行被编码为latin-1,因此在比较之前必须将它们解码为unicode:

>>> encoded = u'release V13.0.0: (Alumin\xadium) improved API'.encode('latin-1')
>>> unicode(encoded)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xad in position 24: ordinal not in range(128)

>>> unicode(encoded, 'latin-1')
u'release V13.0.0: (Alumin\xadium) improved API'