本ブログにはプロモーションが含まれております。

Java

【文字化けを許さない】Javaの文字コードの確認と指定方法

スポンサーリンク

今回はプログラマを悩ませる永遠のテーマ、文字コードについて書いていきたいと思います。例えば、外部APIを叩く際などに、正しく文字コードを指定しなければ文字化けしてしまってうまく処理されず、500 Internal Server Errorになって返ってきますよね。私もJavaを書いている際に文字コードが原因で文字化けし、数時間ほど時間を使ってしまいました。

しかしおかげで有用なサイトや文字コードの考え方に触れることができたので、ぜひご紹介しようと思います。

文字化けの原因を特定する

まずは文字化けしている原因を特定します。文字化けは、「文字コードAで作られたバイナリを、別の文字コードBとして扱う」ことで発生します。そのため、まずは文字化けしている文字列から以下の2点を探すことから始まります。

  1. 参照しているの文字コード (先程の文字コードB)
  2. 本来の文字コード (先程の文字コード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つをまずは確認することが大切です。

最後までお読みいただきありがとうございました。

スポンサーリンク

-Java
-, ,

© 2024 教職志望だった文系エンジニア Powered by AFFINGER5