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

Flask服务非ASCII字符处理异常:POST接口非英语语言返回错误

问题分析与解决方案

首先看你代码里的核心问题:POST请求处理逻辑里的索引错误,加上Python2中Unicode编码处理的疏漏,导致非英语文本检测异常。

1. 致命的POST请求索引错误

你的POST方法里这一行完全写错了:

predict_request = [data['content']][1]

你把data['content']放进了一个只有1个元素的列表,然后去取索引1(第二个元素)——这要么会抛出IndexError,要么如果data['content']本身是列表的话,会错误地取到第二个元素,而非你要检测的文本内容。这就是为什么POST请求只返回一个数字(大概率是textBytesFound,因为没有有效语言检测结果)。

2. Python2的Unicode编码问题

Python2中str和unicode的区分很严格,非英语文本如果编码处理不当,会导致cld2.detect无法正确识别。你的cld2_states方法里直接对输入做encode("utf8"),如果输入已经是str类型(字节),会先尝试用默认编码(ASCII)解码再编码,这会直接破坏非ASCII字符。


修正后的完整代码

from flask import Flask, jsonify, request
from flask_restful import Resource, Api, reqparse
import cld2
import sys

reload(sys)
sys.setdefaultencoding('utf8')

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def cld2_states(self, txt):
        # 确保输入是Unicode字符串
        if isinstance(txt, str):
            txt = txt.decode('utf8')
        # 编码为UTF-8字节给CLD2检测
        txt_bytes = txt.encode("utf8")
        isReliable, textBytesFound, details = cld2.detect(txt_bytes)
        
        outstr = str(textBytesFound)
        for item in details:
            if item[0] != "Unknown":
                # 处理语言名称的编码,避免乱码
                lang_name = item[0].encode('utf8') if isinstance(item[0], unicode) else item[0]
                outstr += '&' + lang_name + '-' + str(item[2]) + '-' + str(int(item[3]))
        return outstr

    def get(self):
        parser = reqparse.RequestParser()
        parser.add_argument('text', type=str)
        parser.add_argument('url', type=str)
        _dict = dict(parser.parse_args())
        
        if _dict["text"] is not None:
            value = _dict["text"]
            # 确保GET参数的编码正确
            if not isinstance(value, unicode):
                value = value.decode('utf8')
            return self.cld2_states(value)
        return None

    def post(self):
        data = request.get_json(force=True)
        # 直接获取content字段,去掉错误的列表索引
        predict_request = data['content']
        
        # 确保POST接收的文本是Unicode
        if not isinstance(predict_request, unicode):
            predict_request = predict_request.decode('utf8')
            
        out = self.cld2_states(predict_request)
        return jsonify(score=out)

api.add_resource(HelloWorld, '/cld2')

if __name__ == '__main__':
    app.run(debug=True, port=6161, host='0.0.0.0')

额外优化建议

  • 删掉没用的导入:BeautiflSoup(拼写还错了)、urllib2、urllib、re这些都没用到,直接移除。
  • 调试时可以在POST方法里加一行print("Received content:", predict_request),确认Java客户端传递的非英语文本是否正确接收(没有乱码)。
  • 考虑升级到Python3:Python2已经停止维护,Unicode处理会简单很多,也能避免很多编码坑。

为什么英语POST正常?

英语字符属于ASCII范围,即使编码处理有疏漏,也不会被破坏,CLD2能正常检测;但乌尔都语、阿拉伯语是多字节的UTF-8字符,编码错误会直接导致检测失效,加上索引错误取到了错误的内容,最终只返回了textBytesFound数字。

内容的提问来源于stack exchange,提问作者Hafiz Muhammad Shafiq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:49