在从节点到Java的调用中实施utf8编码

我正在从一个节点中间层调用一个Java后端,并传递一个string作为查询参数。 一切都很好,直到使用非英文字母字符(例如:ř,ý)。 当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ý 

我的问题涉及在哪里解决这个问题。 我已经find了这个节点的utf8编码器,并且正在考虑在将来调用我的Java层之前将我的string编码为utf8。 这是正确的方法,或者我应该在Java内做些什么?

请注意,这是我的相关请求头像:

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

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

GET只支持ASCII char.set发送其他字符,你需要百分比编码特殊字符。

服务器可能不会实际使用utf-8作为其默认编码(正如通常所说的那样),而是使用ISO-8859-1。

正如可以预料的那样,将无法使用utf-8进行解码(这只会在非ascii字符上显而易见)。 我有一个与JBoss服务器非常类似的问题。

对我来说,解决scheme不是使用request.getParameter()(使用utf-8自动转换参数)来代替:

 String name = new String(request.getParameter("name").getBytes("iso-8859-1"),"utf-8"); 

这似乎是你发送UTF16string和对待UTF-8。 所有的JavaScriptstring都是UTF16。 所以可能是这些参数也是以UTF16格式发送的。 你可以尝试通过一个UTF16编码器在Java方面发送参数,然后将其转换为任何你想要的编码。

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