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.1と3.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"))