我正在从节点中间层调用Java后端并将字符串作为查询参数传递。一切都很好,直到使用非英文字母字符(例如:ř,ý)。当Java收到这些字符时,它会抛出:
parse exception: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8!
此调用完美无缺:
GET http://localhost:8000/server/name?name=smith
此调用因上述错误而失败:
GET http://localhost:8000/server/name?name=sořovský
我的问题涉及到哪里解决这个问题。 我已经为节点找到了this utf8编码器,并考虑在将来调用我的Java层之前将我的字符串编码为utf8。 这是正确的方法还是我应该在Java中做某事?
请注意,这是我的相关请求标题:
{
...
accept: 'application/json, text/plain, */*',
'accept-encoding': 'gzip, deflate, sdch',
'accept-language': 'en-US,en;q=0.8,el;q=0.6',
...
}
答案 0 :(得分:1)
GET仅支持ASCII char.set发送您需要的其他字符来对特殊字符进行百分比编码。
答案 1 :(得分:1)
将您的javascript文件保存到utf8。
var name = "sořovský",
param1 = encodeURIComponent(name);
var url = "http://localhost:8000/server/name?name=" + param1;
console.log(url);
// http://localhost:8000/server/name?name=so%C5%99ovsk%C3%BD
您可以使用GET http://localhost:8000/server/name?name=sořovský
:
{
"args": {
"name": "sořovský"
},
"headers": {
"Accept": "application/json, text/plain, */*",
"Accept-encoding": "gzip, deflate, sdch",
"Accept-language": "en-US,en;q=0.8,el;q=0.6",
//...
},
"url": "http://localhost:8000/server/name?name=sořovský"
}
答案 2 :(得分:0)
服务器可能实际上并不使用utf-8作为其默认编码(通常可以假设),而是使用ISO-8859-1。
使用utf-8无法解码可能出现的问题(这只会在非ascii字符上显而易见)。 我和JBoss服务器有一个非常类似的问题。
我的解决方案不是使用request.getParameter()(使用utf-8自动转换参数)而是使用:
String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8");
答案 3 :(得分:0)
您好像正在发送UTF16字符串并将其视为UTF-8。所有JavaScript字符串都是UTF16。所以可能是params也以UTF16的形式发送。 您可以尝试通过Java端的UTF16编码器发送参数,然后将其转换为您想要的任何编码。
确保检查机器的字节顺序。我希望这有帮助。