在从节点到 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 编码器发送参数,然后将其转换为您想要的任何编码。
确保检查机器的字节顺序。我希望这有帮助。
我正在从节点 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 编码器发送参数,然后将其转换为您想要的任何编码。
确保检查机器的字节顺序。我希望这有帮助。