在从节点到Java的调用中强制执行utf8编码

时间:2016-08-31 14:45:48

标签: javascript java node.js utf-8 jetty

我正在从节点中间层调用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',
  ...
}

4 个答案:

答案 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编码器发送参数,然后将其转换为您想要的任何编码。

确保检查机器的字节顺序。我希望这有帮助。