一尘不染

UnicodeEncodeError:“ latin-1”编解码器无法编码字符

mysql

当我尝试在数据库中插入外来字符时,可能是什么导致此错误?

>>UnicodeEncodeError: 'latin-1' codec can't encode character u'\u201c' in position 0: ordinal not in range(256)

而我该如何解决呢?

谢谢!


阅读 960

收藏
2020-05-17

共1个答案

一尘不染

字符U + 201C左双引号在Latin-1(ISO-8859-1)编码中不存在。


目前在代码页1252(西欧)。这是Windows特定的编码,基于ISO-8859-1,但会将多余的字符放入0x80-0x9F范围内。代码页1252通常与ISO-8859-1混淆,这是一种令人烦恼但现在是标准的Web浏览器行为,如果您将页面作为ISO-8859-1提供服务,则浏览器会将它们视为cp1252。但是,它们实际上是两种不同的编码:

>>> u'He said \u201CHello\u201D'.encode('iso-8859-1')
UnicodeEncodeError
>>> u'He said \u201CHello\u201D'.encode('cp1252')
'He said \x93Hello\x94'

如果仅将数据库用作字节存储,则可以使用cp1252进行编码,以及Windows
Western代码页中的其他字符。但是cp1252中不存在的其他Unicode字符仍然会导致错误。

您可以encode(..., 'ignore')通过消除字符来抑制错误,但实际上在本世纪,您应该在数据库和页面中都使用UTF-8。此编码允许使用任何字符。理想情况下,您还应该告诉MySQL您正在使用UTF-8字符串(通过在字符串列上设置数据库连接和排序规则),这样它就可以正确区分大小写并进行排序。

2020-05-17