'latin-1'编解码器无法编码字符'\ u2019'

问题描述

我正在使用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')

我试图替换不可读的字符,但是它们太多了。是否可以按照错误指示的位置删除字符

解决方法

这基本上是Unicode问题,在任何支持unicode的语言中都会发生。基本原理:

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

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

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

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

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