如何在Python中比较unicode和string?

时间:2015-12-09 15:39:34

标签: python unicode decode encode

我有两个变量(比如xy),它们具有以下值:

x = u'Ko\u0161ick\xfd'
y = 'Ko\x9aick\xfd'

它们可以使用不同的方式编码相同的名称。第一个变量是unicode,第二个变量是字符串。

有没有办法将字符串转换为unicode(或unicode转换为字符串)并检查它们是否真的相同。

我尝试使用encode

x.encode('utf-8')

返回新内容(第三个版本):

'Ko\xc5\xa1ick\xc3\xbd'

使用以下内容:

print x.encode('utf-8')

返回另一个版本:

KošickÛ

所以,我完全糊涂了。有没有办法让所有东西保持相同的格式?

3 个答案:

答案 0 :(得分:2)

您可以将字节字符串转换为Unicode,但如果它包含任何非ASCII字符,则必须指定编码。

if y.decode('iso-8859-1') == x:
    print(u'{0!r} converted to Unicode == {1}".format(y, x))

用你给出的例子,这不是真的;但也许y的编码不同。

理论上,你可以转换任何一种方式,但一般来说,在内部使用全Unicode是有意义的,并将其他编码转换为Unicode以便在你的代码中使用(而不是相反)。

答案 1 :(得分:1)

您需要知道字节字符串的编码。它看起来像windows-1252

x = u'Ko\u0161ick\xfd'
y = 'Ko\x9aick\xfd'

print x == y.decode('windows-1252')
print x.encode('windows-1252') == y

输出:

True
True

最佳做法是在输入到程序时将文本转换为Unicode,以Unicode进行所有处理,然后转换回编码字节以持久存储,在套接字上传输等。

答案 2 :(得分:0)

嗯,utf-8现在已成为交换和Linux世界的事实上的标准,但还有很多其他的编码。

常见的例子是latin1,latin9(与€符号相同),cp1252是它们的windows变体。

在你的情况下:

>>> x.encode('cp1252')
'Ko\x9aick\xfd'

因此y字符串似乎是cp1252编码的。