0

首先,我对 python 很陌生,所以请原谅我所有的 n00b 东西。所以 Python 中的应用程序逻辑是这样的:

  1. 我将 SQL Select 发送到数据库,它返回一个数据数组。
  2. 我需要获取这些数据并在另一个 SQL 插入语句中使用它。

现在的问题是,那个 SQL 查询返回我的 unicode 字符串。select 的输出是这样的:

(u'Abc', u'Lololo', u'Fjordk\xe6r')

所以首先我试图将它转换为字符串,但它失败了,因为第三个元素包含这个德语“ae”字母:

for x in data[0]:
    str_data.append(str(x))

我得到: UnicodeEncodeError: 'ascii' codec can't encode character u'\xe6' in position 6: ordinal not in range(128)

我可以直接插入 unicode 以在发生 TypeError 时也插入。TypeError:强制转换为 Unicode:需要字符串或缓冲区,找到 NoneType

有任何想法吗?

4

2 回答 2

7

根据我的经验,Python 和 Unicode 通常是个问题。

一般来说,如果你有一个 Unicode 字符串,你可以像这样将它转换成一个普通的字符串:

normal_string = unicode_string.encode('utf-8')

并将普通字符串转换为 Unicode 字符串,如下所示:

unicode_string = normal_string.decode('utf-8')
于 2013-05-22T17:27:02.867 回答
4

这里的问题是该str函数尝试使用ascii代码页转换 unicode,而ascii代码页没有映射u\xe6(æ - char reference here)。

因此,您需要将其转换为一些支持字符的代码页。现在最常用的是utf-8编码。

>>> x = (u'Abc', u'Lololo', u'Fjordk\xe6r')
>>> print x[2].encode("utf8")
Fjordkær
>>> x[2].encode("utf-8")
'Fjordk\xc3\xa6r'

另一方面,您可以尝试将其转换为cp1252 -支持它的西方拉丁字母:

>>> x[2].encode("cp1252")
'Fjordk\xe6r'

但是 Eeaster 欧洲字符集cp1250不支持它:

>>> x[2].encode("cp1250")
...
UnicodeEncodeError: 'charmap' codec can't encode character u'\xe6' in position 6: character maps to <undefined>

python中的unicode问题很常见,我建议如下:

  • 了解什么是 unicode
  • 了解 utf-8 是什么(它不是 unicode)
  • 理解 ascii 和其他代码页
  • 推荐的转换工作流程:输入(任何 cp)->转换为 unicode ->(进程)-> 输出为 utf-8
于 2013-05-22T17:56:33.230 回答