Pandas发送utf8编码字符时,使用latin-1编码时出现错误编码字符问题。

2024-06-15 16:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

当我用拉丁语-1编码将utf8编码的字符从pandas发送到mysql时,我得到了错误的编码字符。 这是我在mysql中得到的一个示例值:

Biquíni

这是我的代码:

^{pr2}$

Tags: 代码示例pandas编码错误mysqlutf8字符
1条回答
网友
1楼 · 发布于 2024-06-15 16:24:29

我假设样本值应该是:

print u'Biquíni'.encode('latin_1').decode('utf-8') # Biquíni

因此,在你的代码中:

^{pr2}$

问题是,当您实现链时:

  1. 将unicode编码为“utf-8”字节。
  2. 使用任何1字节编码(如“拉丁语1”)对这些字节进行解码。

对于输入端的每一个非ASCII-unicode字符,输出端总是接收到错误的字符。发生这种情况是因为对于这样一个字符,在'utf-8'中至少有2个字节的值。

让我们看看示例:

print ord(u'z') # 122 => ASCII
print repr(u'z'.encode('utf-8')) # 'z', 1 byte
print repr('z'.decode('latin_1')) # u'z'

如我们所见,对于ASCII字符,一切正常,但是:

print ord(u'í') # 237 => non-ASCII

import unicodedata

print repr(u'í') # u'\xed'
print unicodedata.name(u'\xed') # LATIN SMALL LETTER I WITH ACUTE

print repr(u'\xed'.encode('utf-8')) # '\xc3\xad' => 2 bytes

print repr('\xc3'.decode('latin_1')) # u'\xc3' - the 1st char 
print repr('\xad'.decode('latin_1')) # u'\xad' - the 2nd char

print unicodedata.name(u'\xc3') # LATIN CAPITAL LETTER A WITH TILDE
print unicodedata.name(u'\xad') # SOFT HYPHEN

因此,在编码'utf-8'后的每个非ASCII字符的代码中,会得到2个字节,然后用'latin_1'解码为2个字符,它们与初始字符不对应。

因此,您当前的计划将产生不理想的结果。
我建议在代码中对encode()decode()步骤使用相同的编码。在

相关问题 更多 >