今回はプログラマを悩ませる永遠のテーマ、文字コードについて書いていきたいと思います。例えば、外部APIを叩く際などに、正しく文字コードを指定しなければ文字化けしてしまってうまく処理されず、500 Internal Server Errorになって返ってきますよね。私もJavaを書いている際に文字コードが原因で文字化けし、数時間ほど時間を使ってしまいました。
しかしおかげで有用なサイトや文字コードの考え方に触れることができたので、ぜひご紹介しようと思います。
文字化けの原因を特定する
まずは文字化けしている原因を特定します。文字化けは、「文字コードAで作られたバイナリを、別の文字コードBとして扱う」ことで発生します。そのため、まずは文字化けしている文字列から以下の2点を探すことから始まります。
- 参照しているの文字コード (先程の文字コードB)
- 本来の文字コード (先程の文字コードA)
Javaでも文字コードを推測してくれるライブラリがあるようですが、便利なサイトがありましたのでそちらを紹介します。それは文字化け解決支援(https://ltside.com/enc/)様です。
一番上の入力欄に文字化けする前の文字列を打ち込むと、「もとの文字コード形式」→「誤った文字コード形式参照」のパターンを20パターンほど出してくれます。ここで出た文字化けの結果から、本来はどの文字コードだっったのか、どの文字コードで誤って参照してしまっているのかを把握します。

文字化けを把握したら
続いて、文字化けする前の本来の文字列に戻す作業を行います。これには通常のStringクラスを使って戻していきます。実はStringの第二引数に文字コードを指定することで、その文字コードに従って文字列をつくることができます。
String(byte[] bytes, Charset charset)
そのため、以下のようなコードを書きます。
String original = "太郎"; // もとの文字列 String str1 = "螟ェ驛"; // sjisで書かれた「太郎」をutf-8で読んで文字化け String str2 = new String(str.getBytes("utf-8"), "SHIFT-JIS"); System.out.println(str2) // 太郎
str1である"螟ェ驛"はshift-jisで「太郎」を表しているバイト列を、utf-8として読んでしまった結果です(当然ですがsjisとして読むと「太郎」になります)。そのため、一旦utf-8の方式でバイト列に戻してから、正しくshift-jisでバイト列を文字に変換してあげると文字化けが解消されます。まとめると以下で文字化けを解消できます。
new String(str.getBytes("参照している誤った文字コード"), "本来の正しい文字コード");
まとめ
Javaの文字コードの確認と指定方法と、それを使った文字化けをの解消方法をご紹介しました。文字化けは文字のバイト列を誤った文字コードで参照してしまうことで発生します。文字化けの解消は、①今誤って参照してしまっている文字コード、と②本来参照すべきの文字コードの2つをまずは確認することが大切です。
最後までお読みいただきありがとうございました。