Как правильно сравнить строку Unicode из psycopg2 в Python? - PullRequest
1 голос
/ 19 января 2011

У меня проблема со сравнением строки UTF-8, полученной из базы данных PostgreSQL:

>>> 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 ]

3 голосов
/ 19 января 2011

Это явно проблема с локалью вашей консоли.

u"München" - это u'M\xfcnchen' в Unicode и 'M\xc3\xbcnchen' в UTF-8.Последний - ваш München, если он принят в качестве ISO8859-1 или CP1252.

Psycopg2, кажется, предоставляет вам правильные значения Unicode, как и должно быть.

1 голос
/ 19 января 2011

Если вы наберете

b = 'München'

Что вы получаете от типа (б) ??

Может быть, вам не нужно буквально преобразовывать строку в текст в юникоде, поскольку Python автоматически это заметит.

РЕДАКТИРОВАТЬ: я получаю это из моего Python CLI:

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

Пока вы получаете результат печати в другой кодировке

...