"latin-1" 编解码器无法编码字符

12

我的代码可以处理英文文本,但无法处理俄文搜索文本。我该如何修复?

错误文本

UnicodeEncodeError:“latin-1”编解码器无法对位置41-46的字符进行编码:(‘Москва’)不是有效的Latin-1编码。如果要使用UTF-8编码进行发送,请使用body.encode('utf-8')。

我的代码:

import requests

# search_text = "London" # OK: for english text
search_text = "Москва" # ERROR: 'latin-1' codec can't encode characters in position 41-46: Body ('Москва')
headers = {
    'cookie': 'bci=6040686626671285074; _statid=a741e249-8adb-4c9a-8344-6e7e8360700a; viewport=762; _hd=h; tmr_lvid=ea50ffe34e269b16d061756e9a17b263; tmr_lvidTS=1609852383671; AUTHCODE=VCmGBS9d9sIxDnxN-hzApvPxPoLNADWCZLYyW8JOTcolv2dJjwH7ALYd8dNP9ljxZZuLvoKsDXgozEUt-PjSwXYEDt4syizx1I2LS58gb49kCFae-5uIap--mtLsff2ZqGbFqK5r7buboZ0_3; JSESSIONID=adca48748b8f0c58a926f5e4948f42c0c0aa9463798a9240.1f3566ed; LASTSRV=ok.ru; msg_conf=2468555756792551; TZ=6; _flashVersion=0; CDN=; nbp=; tmr_detect=0%7C1609852395541; cudr=0; klos=0; tmr_reqNum=4; TZD=6.200; TD=200',
}

data = '''{\n "id": 24,\n "parameters": {\n "query": "''' + search_text + '''"\n }\n}'''

response = requests.post('https://ok.ru/web-api/v2/search/suggestCities', headers=headers, data=data)

json_data = response.json()
print(json_data['result'][0]['id'])

我尝试过

city_name = city_name.encode('utf-8')

但是收到了TypeError: must be str, not bytes的错误。


1
看起来错误信息的最后一句告诉你需要做什么来修复它。 - Silvio Mayolo
请查看更新。 - swor
1
你是否尝试发送或接收俄语字符?你需要使用 encode 对字符串进行编码以便发送,使用 decode 对接收到的字节序列进行解码。 - Silvio Mayolo
1
尝试在你的脚本中作为第一行插入 # coding: UTF-8 - user5386938
3个回答

8
在发送请求之前,在创建数据变量的那行代码后面添加这个。
data=data.encode() #will produce bytes object encoded with utf-8

3

在我的情况下:

这个方法起作用了。

import json
import http.client

f = open('YOURFILE.json', encoding="utf8")

data = json.load(f)

message = json.dumps(data['MESSAGE'],ensure_ascii=False).encode('utf-8').decode('unicode-escape')

以下是JSON文件的内容:

{
  "MESSAGE": "یو تی اف 8 کاراکتر"

0
在我的情况下,我想返回一个带有波斯语名称的docx文件,以下方法对我有效:
from fastapi import FastAPI
from fastapi.responses import FileResponse
import urllib.parse

app = FastAPI()

@app.get("/download-file")
async def download_file():
    filename = "فایل.docx"  
    file_path = "path_to_your_file.docx" 

    response = FileResponse(file_path, headers={
        "Content-Disposition": f'attachment; filename*=UTF-8\'\'{urllib.parse.quote(filename)}'
    })
    return response

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接