【问题标题】:how to correctly compare unicode string from psycopg2 in Python?如何在 Python 中正确比较来自 psycopg2 的 unicode 字符串?
【发布时间】:2011-06-11 22:31:22
【问题描述】:

我在比较从 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

【问题讨论】:

  • 你是什么sys.stdout.encoding和sys.stdin.encoding?
  • 假设您的控制台编码是 utf8,您实际上应该使用 b = 'München'.decode('utf8') 来获得您所期望的。

标签: python string unicode utf-8 psycopg2


【解决方案1】:

这显然是您的控制台语言环境的问题。

u"München" 在 Unicode 中是 u'M\xfcnchen',在 UTF-8 中是 'M\xc3\xbcnchen'。如果采用 ISO8859-1 或 CP1252,后者就是您的 München

Psycopg2 似乎为您提供了正确的 Unicode 值,这是应该的。

【讨论】:

  • 嗯,我的也是。看sys.stdin.encodingsys.stdout.encoding的值,都应该是'UTF-8'。也许尝试另一个终端模拟器。出于某种原因,您的终端和 Python 解释器看到相同的字符串 'München' 以不同的方式编码。
【解决方案2】:

如果你输入

b = 'München'

你从 type(b) 得到什么??

也许您不需要将字符串直接转换为 unicode 文本,因为 Python 会自动记录这一点。

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

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

当您以不同的编码获得打印结果时

【讨论】:

  • >>> b = 'München' >>> type(b) >>>
  • 我的语言环境是 en_US.UTF-8,当我输入 b 并回车时,我得到:u'M\xc3\xbcnchen',而不是 u'M\xfcnchen'。但是在另一台机器上,我得到了 u'M\xfcnchen'。我根本不明白,为什么它在第二台机器上有所不同?可能是因为第一台机器有 Python 2.5.2(r252:60911,2010 年 1 月 24 日,14:53:14)和第二台 Python 2.6.6(r266:84292,2010 年 12 月 26 日,22:31:48)吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 2016-01-03
  • 2022-07-22
  • 2011-04-07
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多