问题描述
我正在使用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-8,UTF-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可能是更好的编码选择。