使用 Flask-RESTful 解析非 Unicode 字符串

Parsing a non-Unicode string with Flask-RESTful

我有一个用 Flask-RESTful 开发的 webhook,它用 POST 获取几个参数。 其中一个参数是非 Unicode 字符串,编码为 cp1251

找不到使用 reqparse.

正确解析此参数的方法

这是我的代码片段:

parser = reqparse.RequestParser()
parser.add_argument('text')
msg = parser.parse_args()

然后,我将 msg 写入一个文本文件,它看起来像这样:

{"text": "\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd !\n\n\ufffd\ufffd\ufffd\ufffd\ufffd\n\n-- \n\ufffd \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd."}

如您所见,Flask 以某种方式将所有西里尔字符替换为 \ufffd。同时,非西里尔字符,如 !\n 被正确处理。

我能做些什么来建议 RequestParser 使用字符串编码?

这是我将文本写入磁盘的代码:

 f = open('log_msg.txt', 'w+')
 f.write(json.dumps(msg))
 f.close()

我试过 f = open('log_msg.txt', 'w+', encoding='cp1251') 结果相同。

然后,我尝试了

 f = open('log_msg_ascii.txt', 'w+')
 f.write(ascii(json.dumps(msg)))

同样,没有区别。

所以,我很确定它 RequestParser() 太聪明了,无法理解非 Unicode 输入。

谢谢!

好的,我终于找到了解决方法。感谢@lenz 帮助我解决了这个问题。似乎 reqparse 错误地假设每个字符串参数都以 UTF-8 格式出现。因此,当它看到一个非 Unicode 输入字段(以及其他 Unicode 字段!)时,它会尝试将其加载为 Unicode 但失败了。结果,所有字符都是U+FFFD(替换字符)。

因此,为了访问该非 Unicode 字段,我采​​用了以下技巧。

首先,我使用 get_data() 加载原始数据,使用 cp1251 对其进行解码并使用简单的正则表达式进行解析。

 raw_data = request.get_data()
 contents = raw_data.decode('windows-1251')
 match = re.search(r'(?P<delim>--\w+\r?\n)Content-Disposition: form-data; name=\"text\"\r?\n(.*?)(?P=delim)', contents, re.MULTILINE | re.DOTALL)
 text = match.group(2)

不是最漂亮的解决方案,但它确实有效。