【问题标题】:str encoding from latin-1 to utf-8 arbitrarilystr 任意从 latin-1 编码到 utf-8
【发布时间】:2016-12-08 01:10:18
【问题描述】:

我有一些代码可以从一个环境中获取字符串并在另一个环境中重现它们。我正在使用 Python 3.5。我一直遇到这种错误:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u2013' in 位置 112:正文 ('-') 不是有效的 Latin-1。采用 body.encode('utf-8') 如果你想以 UTF-8 编码发送它。

...我想避免它。此错误来自请求模块。问题是我正在处理数以万计的字符串,并且一直在添加新的字符串。人们正在从 Excel 和诸如此类的东西中剪切和粘贴 - 并且不知道我会遇到什么字符,所以我不能只运行 str.replace()。我想确保从环境 1 获得的每个字符串在发送到环境 2 之前都经过正确的 utf-8 编码。

我尝试了str('yadayada').encode('utf-8).decode('utf-8),但没有成功。我试过str('yadaya', 'utf-8'),但没有奏效。我尝试声明"# -*- coding: UTF-8 -*-",但没有奏效。

【问题讨论】:

  • 您在收到它们时如何确保它们都是utf8?
  • 我尝试了我在帖子中所说的:我尝试了 'yadayada'.encode('utf-8).decode('utf-8) 并且没有用。我试过 str('yadaya', 'utf-8') ,但没有奏效。我尝试声明“# -- coding: UTF-8 --”,但没有奏效。我从对服务器的调用中获取字符串,所以我只是取回一个对象。该对象具有 name 属性,这就是我从对象中获取的内容。但我无法控制该名称属性的值是什么,制作对象的人只是客户或非技术人员,他们从电子邮件、Excel 等中剪切和粘贴这些名称。

标签: string python-3.x character-encoding


【解决方案1】:

在 Python3 中,标准字符串是 utf-8,因此没有像在 python2 中那样的编码。 requests 的问题试图自动编码数据以进行传输。后备是 latin1 (或者可能只是它的前 127 个字符)。为了给请求提供足够的信息,您应该对其进行编码。

headers = {'Content-Type': 'text/text; charset=utf-8'}
requests.post(url,data = text.encode('utf-8'), headers = headers)

【讨论】:

    【解决方案2】:

    我远不是 python 专家,但是:str('yadayada').encode('utf-8).decode('utf-8) 包含语法错误,

    str('yadayada').encode('utf-8').decode('utf-8') ==注意关闭 '

    【讨论】:

    • 谢谢,但这可能只是一个错字,您的答案应该是评论(稍后您将拥有此权利,当您获得更多声望点时)
    【解决方案3】:

    根据帖子开头的错误消息,(a) 您有一个 unicode 字符串(其中包含字符 \u2013 等字符)并且 (b) 您正尝试将其编码为 Latin-1。 (a) 是好的。 (b) 不好,您应该将其编码为 utf-8。

    所以,你需要发送的是

    input_data.encode('utf-8')
    

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

    顺便说一句,在现实世界中不存在以 Latin-1 编码的数据,如果您需要处理遗留数据,请使用 windows-1252 或类似版本而不是 latin1 进行解码。

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多