python,UnicodeEncodeError,将unicode转换为ascii

时间:2013-05-22 17:17:51

标签: python unicode python-2.7

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

  1. 我正在发送和SQL Select到数据库,它返回一个数据数组。
  2. 我需要获取此数据并在另一个SQL插入句子中使用它。
  3. 现在问题是,SQL查询返回unicode字符串。 select的输出是这样的:

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

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

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

    我得到:UnicodeEncodeError:'ascii'编解码器无法对位置6中的字符u'\ xe6'进行编码:序数不在范围内(128)

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

    有什么想法吗?

2 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:4)

此处的问题是str函数尝试使用ascii代码页转换unicode,而ascii代码页没有u\xe6的映射(æ - char reference { {3}})。

因此,您需要将其转换为支持char的代码页。现在最常见的是here编码。

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

另一方面,您可以尝试将其转换为支持它的utf-8

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

但是Eeaster欧洲字符集cp1252 - Western latin alphabet不支持它:

>>> 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) - &gt; cp1250 - &gt; (过程) - &gt;输出到utf-8