将字符串编码从Latin-1转换为UTF-8任意。

14
我有一些代码,它从一个环境中获取字符串并在另一个环境中重新生成这些字符串。我正在使用Python 3.5版本。我不断遇到以下类型的错误:
UnicodeEncodeError:'latin-1'编解码器无法在位置112处对字符'\u2013'进行编码:Body('–')不是有效的Latin-1编码。如果要以UTF-8编码发送,请使用body.encode('utf-8')。
... 我想避免它。这个错误来自requests模块。问题是我正在处理成千上万个字符串,并且新字符串随时被添加。人们在Excel和其他程序中剪切和粘贴,而且不知道我将遇到哪些字符,因此我不能只运行str.replace()函数。我希望确保从环境1获取的每个字符串在发送到环境2之前都被正确地UTF-8编码。
我尝试了str('yadayada').encode('utf-8).decode('utf-8)和str('yadaya', 'utf-8) ,但都没有起作用。我还尝试声明 "# -*- coding: UTF-8 -*-",但那也没有起作用。

当您接收到它们时,您会采取什么措施确保它们都是UTF8编码的? - themistoklik
我尝试了帖子中提到的方法:'yadayada'.encode('utf-8).decode('utf-8') 不起作用。str('yadaya', 'utf-8') 也不行。我尝试了声明 "# -- coding: UTF-8 --",但还是不行。我从调用服务器获取字符串,所以我只是得到一个对象。该对象有一个名称属性,这就是我从对象中获取的内容。但我无法控制该名称属性的值,制作对象的人只是客户或非技术人员,他们从电子邮件、Excel等中复制和粘贴这些名称。 - Daniel Dow
2个回答

22
在Python3中,标准字符串是utf-8,因此不像Python2中那样需要进行编码。问题在于requests尝试自动对数据进行编码以进行传输,而回退则是使用latin1(或者只是其中的前127个字符)。为了提供足够的信息给requests,你应该对其进行编码。
headers = {'Content-Type': 'text/text; charset=utf-8'}
requests.post(url,data = text.encode('utf-8'), headers = headers)

这对我不起作用,会出现相同的错误。 - lolololol ol

0
根据帖子开头的错误信息,(a)您有一个Unicode字符串(其中包含字符\u2013),(b)您正在尝试将其编码为Latin-1。 (a)是好的。 (b)是不好的,您应该将其编码为utf-8。
所以,您需要发送的是:
input_data.encode('utf-8')

似乎存在不必要或虚假输入的问题。 这不是您可以通过编码调整来解决的问题。 您可能需要维护一个删除和替换字典。 这需要管理协助才能起步。 它需要在第一次输入到数据库时完成。

顺便说一下,在现实世界中不存在使用Latin-1编码的数据,如果您需要处理旧数据,请使用Windows-1252或类似编码进行解码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接