如何在Python中正确比较psycopg2中的unicode字符串?

时间:2011-01-19 17:36:55

标签: python string unicode utf-8 psycopg2

我在比较从PostgreSQL数据库获得的UTF-8字符串时遇到问题:

>>> db_conn = psycopg2.connect("dbname='foo' user='foo' host='localhost' password='xxx'")
>>> db_cursor = db_conn.cursor()
>>> sql_com = ("""SELECT my_text FROM table WHERE id = 1""")
>>> db_cursor.execute(sql_com)
>>> sql_result = db_cursor.fetchone()
>>> db_conn.commit()
>>> db_conn.close()
>>> a = sql_result[0]
>>> a
u'M\xfcnchen'
>>> type(a)
<type 'unicode'>
>>> print a
München
>>> b = u'München'
>>> type(b)
<type 'unicode'>
>>> print b
München
>>> a == b
False

我真的很困惑为什么会这样,我可以告诉我如何将字符串与数据库中的变音符号与另一个字符串进行比较,所以比较是真的?我的数据库是UTF8:

postgres@localhost:$ psql -l
        List of databases
   Name    |  Owner   | Encoding 
-----------+----------+----------
 foo       | foo      | UTF8

2 个答案:

答案 0 :(得分:3)

这显然是控制台区域设置的问题。

u"München"在Unicode中为u'M\xfcnchen',在UTF-8中为'M\xc3\xbcnchen'。如果将其视为ISO8859-1或CP1252,则后者为München

Psycopg2似乎为您提供了正确的Unicode值。

答案 1 :(得分:1)

如果您输入

b = 'München'

你从类型(b)中得到什么?

也许你不需要将字符串逐字转换为unicode文本,因为Python会自动记下这一点。

编辑:我从我的python CLI得到这个:

>>> b = u'München'
>>> b
u'M\xfcnchen'
>>> print b
München

虽然您以不同的编码方式获取打印结果