我有包含字符"\x80"代表欧元符号的ascii字符串:

>>> print "\x80"
€

将包含此字符的字符串数据插入数据库时​​,我得到:
psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0x80
HINT:  This error can also happen if the byte sequence does not match the encodi
ng expected by the server, which is controlled by "client_encoding".

我是unicode新手。如何将包含"\x80"的字符串转换为包含相同欧元符号的有效UTF-8?我尝试在各种字符串上调用.encode.decode,但遇到错误:
>>> "\x80".encode("utf-8")
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    "\x80".encode("utf-8")
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

最佳答案

问题始于错误的前提:



ASCII字符在“\x00”到“\x7F”(含)范围内。

先前接受的现在已删除的答案在两个严重误解下操作:(1),区域设置==编码(2),latin1编码将“\x80”映射为欧元字符。

实际上,所有ISO-8859-x编码都将“\x80”映射到U + 0080,这是C1控制字符之一,而不是欧元字符。这些编码中只有3种(x在(7,15,16)中)提供欧元字符,作为“\xA4”。参见this Wikipedia article

您需要知道数据的编码方式。在什么机器上创建数据?如何?它创建于的语言环境(不一定是您的语言环境)可能会给您一个提示。

请注意,“我的数据是用latin1编码的”位于上方,并带有“邮件中的支票”和“当然我会在早上爱你”。您的数据可能是以Windows平台上发现的cp125x编码之一进行编码的。请注意,除了cp1251(Windows Cyrillic)以外,所有其他字符都将“\x80”映射到欧元字符:

>>> ['\x80'.decode('cp125' + str(x), 'replace') for x in range(9)]
[u'\u20ac', u'\u0402', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac']

根据运算符(operator)的评论更新



这有点令人困惑:首先您要说



但是后来你说



请解释。

选择适当的cp125x编码:文件创建在哪里(地理位置)?文字用什么语言书写?除假定的euro之外,是否还有其他字符,其值>“\x7f”?如果是这样,它们将用于哪些环境?

更新2 如果您不“知道程序是如何编写的”,则您或我们都无法就其是否始终对欧元字符使用“\x80”形成意见。尽管这样做否则将是巨大的愚蠢,但这不能排除。

如果文本是用英语编写的和/或在美国编写的和/或在Windows平台上编写的,则可以肯定地确定cp1252是行之有效的方法...直到获得相反的证据为止,在这种情况下,您需要自己猜测编码或回答(什么语言,什么位置)问题。

10-07 12:51
查看更多