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点の対応を入れたところ、サーバ側で文字化けせずに日本語を表示することが出来ました。