Android開発 | DefaultHttpClientでHTTPリクエストするときの文字化け対策
2017/01/30
AndroidアプリでDefaultHttpClientを使ってJSON形式で日本語を含む電文をPOST送信してみたのですが、サーバ側で受信した日本語が「?」と文字化けしてしまったため、その時の対応法を紹介します。
切り分けのためWiresharkでサーバ側のパケットキャプチャを取得してみると、HTTPリクエストのパケット中で「?(0x3f)」となっていたため、Androidアプリ側の送信時にすでに文字化けしていました。
前提として文字コードはUTF-8を前提としています。
HTTPのContent-Typeヘッダにcharset=UTF-8をつける必要がある
ライブラリの説明を見るとデフォルトの文字コードは「 ISO-8859-1」で送信するため、別の文字コードを使う場合は「Content-Type」で指定するようにとの記載がありました。そのため、UTF-8で送信する場合は以下のヘッダを指定する必要があります。
Content-Type: text/html; charset=UTF-8
そのため、以下のように「Content-Type」を指定する必要があります。
HttpPost method = new HttpPost(url);
method.setHeader("Content-Type", "application/json; charset=UTF-8");
setEntityの第二引数にUTF-8を指定する
AndroidでJSONのような生データをHTTPで送信する場合はStringEntityを使用しますが、どうやらコンストラクタの第二引数に文字コードを指定する必要があるそうです。
method.setEntity(new StringEntity(body, "UTF-8"));
以上の2点の対応を入れたところ、サーバ側で文字化けせずに日本語を表示することが出来ました。