Tomcat上でのHttpレスポンスの文字コード判定

Tomcat上のWEBアプリケーションにてHttpレスポンスを受け取ったけれど、文字コードを判定できない事態が発生したため記載します。

状況

Tomcat 8上のWEBアプリケーションにて他システムからREST APIを通じてJSON形式のデータを受け取りましたが、データ内の日本語に文字化けが発生しました。Tomcatでは自身のエンコーディングUTF-8に設定するためにJavaオプションで-Dfile.encoding=utf-8 -Dsun.jnu.encoding=UTF-8を付与しており、他システムのエンコーディングUTF-8が設定されていました。

原因

レスポンスヘッダーを確認したところ、Content-Textでapplication/jsonだけが指定されており、文字コードは指定されておりません。TomcatではHTTP/1.1規約のセクション3.4.13.7.1に則っているため、レスポンスボディーの文字コードを標準でISO-8859-1として判断していると考えられます。そうであれば、今回の原因は文字コートが指定されていなかったことにありそうです。

対策

他システムからHttpレスポンスを受け取る際には、レスポンスヘッダーのContent-Textにcharsetを指定してもらうようにしましょう。今回のケースではContent-Textを以下に設定してもらうことで解決しました。

application/json; charset=utf-8

どうしてもHttpレスポンスを改修できないようであれば、以下の様に文字コードを変換するしかありません。

new String(jsonText.getBytes("ISO-8859-1"), Charset.forName("UTF-8"))

参照