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

Enforce utf8 encoding in call from node to Java

我正在从节点 middle-tier 调用 Java 后端并将字符串作为查询参数传递。在使用 non-English 字母字符(例如:ř,ý)之前,一切都很好。当 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 内做某事?

注意,这是我的相关请求 headers 的样子:

{
  ...
  accept: 'application/json, text/plain, */*',
  'accept-encoding': 'gzip, deflate, sdch',
  'accept-language': 'en-US,en;q=0.8,el;q=0.6',
  ...
}

GET 仅支持 ASCII char.set 发送您需要对特殊字符进行百分号编码的其他字符。

将您的 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ý"
}

有可能服务器实际上并没有使用 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");

您似乎正在发送 UTF16 字符串并将其视为 UTF-8。所有 Java 脚本字符串都是 UTF16。所以可能是参数也作为 UTF16 发送。 您可以尝试通过 Java 端的 UTF16 编码器发送参数,然后将其转换为您想要的任何编码。

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