我正在使用 python http.client 将 JSON 数据内容上传到弹性搜索索引。我成功地实现了放置数据,但我遇到了字符问题。一旦插入,特殊字符就像é
输出é
。
这是代码:
import http.client
connection = http.client.HTTPConnection(elastic_address)
headers = {"Content-type": "application/json", "Accept": "text/plain"}
connection.request('PUT', url=endpoint, headers = headers, body=json_data.encode('utf-8'))
我注意到,如果我在发送之前更改源 JSON 中的特殊字符,就像é
替换为一样\u00E9
,它工作正常。可能是因为 Elasticsearch 使用了另一种字符编码,但是根据这个链接,ES 使用 utf-8 作为字符编码。
我还概述了 http.client 包的 client.py,似乎数据是用 latin-1 编码的,见下文:
def _encode(data, name='data'):
"""Call data.encode("latin-1") but show a better error message."""
try:
return data.encode("latin-1")
except UnicodeEncodeError as err:
raise UnicodeEncodeError(
err.encoding,
err.object,
err.start,
err.end,
"%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') "
"if you want to send it encoded in UTF-8." %
(name.title(), data[err.start:err.end], name)) from None
我不确定问题出在哪里,在脚本中?在 http.client 包中?在 Elasticsearch 索引设置中?
任何想法?