在从Node调用Java时强制使用UTF8编码

9

我正在从node中间层拨打到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ý

我的问题涉及到在哪里解决这个问题。 我找到了适用于Node的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',
  ...
}

1
如果Java端出现此错误,则输入很可能未正确编码为UTF-8,因此您必须查看Node端为什么未正确编码它。没有更多细节(您的代码是什么样子?),很难给出更详细的答案。 - Jesper
2
需要更多关于您的URL(以及可能的请求头)的详细信息。您能否捕获请求头并将其添加到您的问题中? - Joakim Erdfelt
@JoakimErdfelt,我已经在我的问题中添加了相关的请求头。 - MattDionis
1
@bruceceng,我添加了更多细节,即我所做的GET请求。 - MattDionis
如果您使用POST,就不需要进行编码。我不认为GET会尝试对您要发布的URL进行任何操作。您需要对URL参数进行编码。您是在说,如果您对名称进行编码并将其更改为so%C5%99ovsk%C3%BD,那么它可以工作吗? - ismoore999
显示剩余3条评论
4个回答

1

GET请求只支持ASCII字符集,如果要发送其他字符,需要进行百分号编码以转义特殊字符。


所以看起来我的选择是将GET改为POST或在将字符串作为查询参数传递之前对其进行编码。 - MattDionis
是的,那是正确的。在我看来,编码应该是你的首选。 - Nicklas Andersson

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ý"
}

0

看起来你正在发送UTF16字符串并将其视为UTF-8。所有JavaScript字符串都是UTF16的。因此,参数也可能以UTF16的形式发送。

您可以尝试通过Java端使用UTF16编码器发送参数,然后将其转换为所需的任何编码。

确保还检查了您机器的字节序。希望这可以帮助到您。


在Java中将字符串从UTF16转换为UTF8比在JavaScript中更容易。我相信有很多API可以使用。 - dimitrirostavo

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接