2011-01-19 3 views
1

J'ai un problème avec la comparaison d'une chaîne obtenue à partir de la base de données PostgreSQL UTF-8:comment comparer correctement la chaîne unicode de psycopg2 en Python?

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

Je suis vraiment confus pourquoi est-ce, je quelqu'un peut me dire comment dois-je comparer une chaîne avec un tréma de la base de données à une autre chaîne, de sorte que la comparaison est vraie? Ma base de données est UTF8:

[email protected]:$ psql -l 
     List of databases 
    Name | Owner | Encoding 
-----------+----------+---------- 
foo  | foo  | UTF8 
+0

Qu'est-ce que sys.stdout.encoding et sys.stdin.encoding? –

+0

En supposant que votre encodage de console est utf8, vous devriez utiliser 'b = 'München'.decode (' utf8 ')' pour obtenir ce que vous attendez. – piro

Répondre

1

Si vous tapez

b = 'München' 

Qu'est-ce que vous obtenez de type (b) ?? Peut-être n'avez-vous pas besoin de transformer littéralement la chaîne en texte Unicode car Python le remarquera automatiquement.

EDIT: Je reçois ce de mon CLI python:

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

Pendant que vous gettin' le résultat d'impression dans un codage différent

+0

>>> b = 'München' >>> type (b) >>> – miernik

+0

Oui, je me suis trompé à ce sujet. Quel est le paramètre de vos paramètres régionaux? – mguillech

+0

Mon locale est en_US.UTF-8, et quand je tape simplement b et que j'appuie sur enter, j'obtiens: u'M \ xc3 \ xbcnchen ', pas u'M \ xfcnchen'. Mais sur une machine différente, je me suis trompé. Je ne comprends pas du tout, pourquoi est-ce différent sur la deuxième machine? Peut-il être parce que la première machine a Python 2.5.2 (r252: 60911, 24 janvier 2010, 14:53:14) et le second Python 2.6.6 (r266: 84292, 26 déc 2010, 22:31:48)? – miernik

3

Ceci est clairement un problème avec locale de votre console.

u"München" est est u'M\xfcnchen' en Unicode et 'M\xc3\xbcnchen' en UTF-8. Ce dernier est votre München si pris comme ISO8859-1 ou CP1252. Psycopg2 semble vous fournir des valeurs Unicode correctes, comme il se doit.

+0

Mes paramètres régionaux sont en_US.UTF-8 – miernik

+0

Hmm, c'est le mien. Regardez la valeur de 'sys.stdin.encoding' et' sys.stdout.encoding', les deux devraient être 'UTF-8'. Peut-être essayer un autre émulateur de terminal. Pour une raison quelconque, votre terminal et l'interpréteur Python voient la même chaîne 'München' encodée différemment. – 9000

Questions connexes