2016-08-31 2 views
9

ノードの中間層からJavaバックエンドにコールし、文字列をクエリのパラメータとして渡しています。英語以外のアルファベット文字が使用されるまで、すべてがうまく動作します(例:ř、ý)。 Javaはこれらの文字を受信した場合には、スロー:ノードからJavaへの呼び出しでutf8エンコーディングを実行する

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エンコーダが見つかりました。私の文字列を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で正しくエンコードされない可能性が高いため、ノード側で正しくエンコードしていない理由を調べる必要があります。詳細がなければ(コードはどのように見えるのですか?)、より詳細な答えを与えることは非常に難しいです。 – Jesper

+0

@Jesper、ありがとう!私は私の質問に私の要求オプションを示す詳細を追加しました。 – MattDionis

+2

あなたのURL(および潜在的なリクエストヘッダー)が何であるかについての詳細が必要です。リクエストヘッダーをキャプチャして質問に追加できますか? –

答えて

1

utf8にjavascriptファイルを保存します。

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

をGETのみパーセントエンコードに特殊文字をあなたが必要とする他の文字を送信するためにASCIIのchar.setをサポートしています。

注、これは私の関連するリクエストヘッダがどのように見えるかです。

+0

私のオプションは、 'GET'を' POST'に変更したり、文字列をエンコーディングしてからクエリパラメタとして渡したりするようです。 – MattDionis

+0

はい、正しいです。私の意見ではエンコーディングが最初の選択になるはずです。 –

0

サーバが実際にそのデフォルトのエンコーディングとしてUTF-8を使用していない可能性があるを使用しています(1は通常asumeかもしれませんが)ではなく、 ISO-8859-1

これは、utf-8を使用してデコードすることができません(これはアスキー文字以外では明らかです)。 私はJBossサーバーに非常によく似た問題がありました。

私のためのソリューションではなく、代わりに使用するrequest.getParameter()を(それが自動的にUTF-8を使用してパラメータを変換)を使用してであった:あなたがUTF16文字列を送信して治療されているよう

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

それは思えますUTF-8。すべてのJavaScript文字列はUTF16です。したがって、パラメータもUTF16として送信されている可能性があります。 Java側のUTF16エンコーダ経由でパラメータを送信し、必要なエンコーディングに変換することができます。

マシンのエンディアンも確認してください。私はこれが役立つことを願っています

+0

また、文字列をJavaのUTF16 - > UTF8からJavaScriptに変換する方が簡単です。私はAPIのトンがあると確信しています。 – dimitrirostavo

関連する問題