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
相关产品推荐
相关产品推荐

