【问题标题】:Enforce utf8 encoding in call from node to Java在从节点到 Java 的调用中强制执行 utf8 编码
【发布时间】:2017-01-08 05:30:07
【问题描述】:

我正在从节点中间层调用 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ý

我的问题涉及到哪里解决这个问题。 我找到了节点的thisutf8 编码器,并且正在考虑在将来调用我的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',
  ...
}

【问题讨论】:

  • 如果 Java 端给你这个错误,那么输入很可能没有以 UTF-8 正确编码,所以你必须看看为什么 Node 端没有正确编码。没有更多细节(你的代码是什么样的?)很难给出更详细的答案。
  • @Jesper,谢谢!我在问题中添加了详细信息,显示了我的请求选项。
  • 需要有关您的 url(和潜在的请求标头)的更多详细信息。您可以捕获请求标头并将其添加到您的问题中吗?
  • @JoakimErdfelt 我在我的问题中添加了相关的请求标头。
  • @bruceceng,添加了更多细节,即我提出的GET 请求。

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


【解决方案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】:

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

    【讨论】:

    • 所以看来我的选择是将 GET 更改为 POST 或在将字符串作为查询参数传递之前对其进行编码。
    • 是的,这是正确的。在我看来,编码应该是你的首选。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      请务必检查您的机器的字节顺序。我希望这有帮助。

      【讨论】:

      • 此外,在 Java 中从 UTF16 -> UTF8 转换字符串比在 JavaScript 中更容易。我确信有大量的 API。
      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多