当数据是unicode时,Play拒绝接受POST请求,我得到:
解析application / x-www-form-urlencoded
时出错
我觉得一切都很好,直到我用希伯来语而不是英语尝试了一个带有文本的请求,所以请求
value=hey
工作正常,但请求
value=%u05D4%u05D9%u05D9
失败。
我找到了something about it,但他说他通过改变play / api / mvc / ContentType.scala使其成功,这是我想避免的。
任何想法?
谢谢!
我知道编码不符合application/x-www-form-urlencoded
的标准,但我需要处理这种情况,目前无法更改客户端,它使用javascript escape
方法。
我正在寻找后端方面的解决方案,这是Play解决方案 找到一个可以在java中实现的解决方案会很好,但是现在看起来解决方案是编写我自己的BodyParser(在scala中)。
答案 0 :(得分:1)
根据我的研究,在application/x-www-form-urlencoded
正文中处理Unicode的正确方法是将Unicode转换为文档默认字符集中的字节(即UTF-8),然后对字节进行URL编码(即% -encode)。
当然,就规范而言,您目前所做的事情(使用'%uxxxx'序列)不是有效的编码。 (你不能像那样把东西拉出空中......并希望它起作用。)
参考文献:
维基百科:http://en.wikipedia.org/wiki/Percent-encoding#The_application.2Fx-www-form-urlencoded_type
HTML规范:http://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm。这给出了浏览器应该使用的算法。如果你做/产生类似的东西,你应该没事。
我注意到您通过浏览器的控制台发现了这种转义语法。以下是MSDN对Javascript escape()
方法的说法:
“转义和unescape函数对于非ASCII字符无效,并且已弃用。在JavaScript 1.5及更高版本中,请使用encodeURI,decodeURI,encodeURIComponent和decodeURIComponent。”
我认为“无法正常工作”意味着他们使用浏览器无法识别的非标准转义语法。课程:阅读规范而不是依靠实验。