You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI接收含希伯来语表单数据出现编码乱码问题求助

解决思路

问题本质:双重UTF-8编码导致乱码

你遇到的是典型的双重编码问题:外部服务声称发送的是Unicode数据,但实际是把原始希伯来语的UTF-8字节串错误当成了Latin-1(iso-8859-1)字符串,再重新做了一次UTF-8编码,最终导致数据被编码两次,出现乱码。

验证一下:原始希伯来语שלום的UTF-8字节是b'\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d',如果把这个字节串按Latin-1解码成字符串,再用UTF-8编码,就会得到你现在拿到的b'\xc3\x97\xc2\xa9\xc3\x97\xc2\x9c\xc3\x97\xc2\x95\xc3\x97\xc2\x9d',解码后就是שלו×。

快速修复方案

方案1:在FastAPI中反向修正编码

直接对接收的乱码字符串做反向解码操作,抵消双重编码的影响:

@app.post('/....')
async def get_message(request:Request, message:str=Form(...)):
    # 先将乱码字符串编码为UTF-8字节,再按Latin-1解码得到原始内容
    fixed_message = message.encode('utf-8').decode('iso-8859-1')
    print(fixed_message)  # 输出正确的希伯来语'שלום'

方案2:手动解析原始请求体

绕过FastAPI自动的表单编码处理,直接读取原始请求体并解析:

from urllib.parse import parse_qs

@app.post('/....')
async def get_message(request:Request):
    # 读取原始请求体字节
    raw_body = await request.body()
    # 按Latin-1解码后解析表单数据
    form_data = parse_qs(raw_body.decode('iso-8859-1'))
    message = form_data.get('message')[0]
    print(message)  # 输出正确的希伯来语

方案3:要求外部服务修正发送逻辑

联系外部服务,让他们直接发送原始UTF-8编码的表单数据,不要对Unicode字符串做额外的编码转换——这是从根源解决问题的方式。

为什么之前Bottle代理能正常工作?

Python2.7的Bottle中,request.forms返回的是字节串字典,requests.post发送时会自动将这些字节串按Latin-1编码后提交,刚好抵消了外部服务的双重编码操作,所以后端能正确解析。

内容的提问来源于stack exchange,提问作者Peleg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:39:20