【问题标题】:'latin-1' codec can't encode character '\u2019'“latin-1”编解码器无法编码字符“\u2019”
【发布时间】:2020-11-10 13:25:01
【问题描述】:

我正在使用 staxii 从外星金库 otx 导出提要,并尝试将它们发送到 misp。但是在发送一些提要时,出现以下错误:

UnicodeEncodeError: 'latin-1' codec can't encode character '\u2019' in position 3397: Body ('’') is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

for filename in os.listdir(dest_directory):
filenameWithDir = dest_directory+filename
try:
    file_index += 1
    print("****************")
    print(dest_directory + filename)
    print(file_index)
    print("****************")
    misp_config.upload_stix(filenameWithDir, '1')
except UnicodeEncodeError:
    with open(filenameWithDir, 'r') as file:
        filedata = file.read()
        filedata = filedata.replace('вЂ', ' ').replace('’', ' ').replace('“', ' ').replace('”', ' ')\
            .replace('–', ' ').replace('—', ' ').replace('™', ' ').replace('​', ' ').replace(' ', ' ')\
            .replace(' ', ' ').replace('…', ' ').replace(' ', ' ').replace('미북 정상회담 전망 및 대비', ' ')\
            .replace(',', ' ').replace('•', ' ').replace('‑', ' ')

    with open(filenameWithDir, 'w') as file:
        file.write(filedata)
    file_index += 1
    print("****************")
    print(dest_directory + filename)
    print(file_index)
    print("****************")
    misp_config.upload_stix(filenameWithDir, '1')

我尝试替换不可读的字符,但字符太多。是否可以按错误指示的位置删除字符?

【问题讨论】:

标签: python python-3.x encode


【解决方案1】:

这基本上是一个 Unicode 问题,在任何支持 Unicode 的语言中都会发生。基础知识:

  • Unicode 是一个标准,旨在为任何已知的书写系统定义一个众所周知的代码(和名称)。
  • 编码是使用一个或多个字节存储和传输 Unicode 代码点(“字符”)的方式。

有一些编码可以存储任何随机的 Unicode 代码点(例如 UTF-8UTF-16)以及只允许 Unicode 代码点的子集的编码 - 例如ISO 8859-1 (aka Latin-1) encoding 只支持一个小的 ASCII 超集。

Python 使用.encode(用于 str → bytearray)和.decode(用于 bytearray → str)在 Unicode 数据 (str) 和字节数据 (bytearray) 之间进行转换。您的代码(或由您的代码调用的代码)显然使用了 .encode('latin-1'),但是对于 右单引号 \u2019,此编码失败,因为 Latin-1 不支持此字符。 p>

您可以使用其他编码来发送该字符。 UTF-8 编码是一个不错的选择,但您的对方也必须配置为使用此编码,否则您将收到一些Mojibake 对方将您的 UTF-8 数据解释为 Latin-1 和您的字符 可以显示为 ’

如果您使用的是 Windows,很可能您的源数据使用的是 Windows-1252 而不是 Latin-1 - 这种编码非常相似,并且具有您的 右单引号的编码,所以也许 Windows-1252 可能是更好的编码选择。

【讨论】:

  • 最后一段可能应该更加强调。 “智能引号”是 latin-1 和 cp1252 之间较大的(在最常见的意义上)差异之一(latin-1 中的一堆大部分未使用的控制代码用于 cp1252 中的字符)。而且 cp1252 也不是纯粹的 Windows 东西。 “Windows-1252”是 HTML5 中 text/ MIME 类型的 默认 编码(是的,我不知道他们为什么这样做),所以在 UTF-8 之后,它可能是最常见的单一编码使用网络上的字符编码。 OP 的源数据很可能是 cp1252,即使他们不在 Windows 上。
  • 哦,当然,源数据可以是保存在任何编码中的常规数据,这些编码由启用了智能引号的 Microsoft 产品生成。即使它被保存为 UTF-8 或 UTF-16 而不是 cp1252,您也会希望看到很多智能引号。
猜你喜欢
  • 2018-12-11
  • 2012-01-07
  • 2011-04-25
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多