8

为什么以下字符串比较不起作用?我有以下代码(我对其进行了调整以使其更简单)。我从数据库中检索一个玩家并将其添加到玩家列表中。然后我循环播放器列表并尝试找到它,即使字符串相同,比较返回 false ..

def findPlayer2(self, protocol, playerId):
    cur = self.conn.cursor()
    cur.execute("SELECT playerId, playerName, rating FROM players WHERE playerId LIKE (%s)", [playerId])
    nbResult = cur.rowcount
    result = cur.fetchone()
    cur.close()

    if nbResult > 0:
        player = Player(protocol, str(result[0]), str(result[1]), result[2])
        self.players.append(player)

    for player in self.players:
        id1 = str(player.playerId)
        id2 = str(playerId)
        print type(id1)
        print type(id2)
        print "Comparing '%s' with '%s'" % (id1, id2)

# HERE IS THE COMPARISON

        if id1 == id2:
            print "Equal! Player found!"
            return player
        else:
            print "Not equal :("

给出以下结果:

<type 'str'>
<type 'str'>
Comparing '11111111' with '11111111'
Not equal :(
4

2 回答 2

8

您似乎有一个字符串处理错误。 PlayerId似乎是存储在 unicode 字符串中的 C 字符串。

背景:C使用 nullbyte ( \x00) 来标记字符串的结尾。由于此 nullbyte 在您的字符串中,因此它最终以对象的字符串表示形式出现。

你可以看看这里,以供参考。但是如果没有更多代码,我不确定原因/修复。

你试过type(playerId)吗?

编辑:我不知道您使用的是什么 python 实现,对于 cpython 看这里

不幸的是,我并不坚定地连接 c 和 python,但是您可以尝试PyString_FromString在 c 端将其转换为 python 字符串或使用一些手工制作的函数(例如,在第一个未转义的0 处使用正则表达式拆分)。

此awnser中列出了一些接口库

于 2013-06-05T14:37:39.007 回答
4

您可以像这样剥离任何不可打印的字符

import string
player = ''.join(filter(lambda c: c in string.printable, player))
于 2013-06-05T14:43:34.750 回答