Java入門|文字コード

文字は見た目だけではなく、数字でも管理されている。文字コードのしくみを知ると、Javaの文字の世界がもっとよくわかる

これまでに、Javaでは文字や文字列をリテラルとして書けることや、エスケープシーケンスを使うと特別な文字を表せることを学んできました。ここまで学ぶと、画面に表示される文字は、ただそのまま存在しているように見えるかもしれません。けれども、コンピュータの内部では、文字は見た目のままではなく、数値として管理されています。

たとえば、私たちは A や あ を文字として見ていますが、コンピュータはそれをそのまま理解しているわけではありません。内部では、それぞれの文字に対応する番号のようなものがあり、その数値をもとに文字を区別しています。この 文字と数値の対応 を表しているのが 文字コード です。

Javaでは、文字を扱うときに Unicode という文字コードの仕組みが使われています。そのため、アルファベットだけでなく、日本語のようなさまざまな文字も幅広く扱うことができます。さらに、エスケープシーケンスを使えば、その文字コードを直接指定して文字を出力することもできます。

ここでは、文字コードとは何か、なぜ文字が数値として扱われるのか、Javaではどのように文字コードを扱うのか、そしてエスケープシーケンスを使って文字コードから文字を表示する方法まで、サンプルプログラムを交えながら丁寧に見ていきましょう。

文字はコンピュータの中で数値として扱われている

私たちが画面で見ている文字は、コンピュータの内部では数値として管理されています。これは少し意外に感じるかもしれませんが、コンピュータは文字の形そのものを理解しているのではなく、文字に割り当てられた番号を使って処理しています。

たとえば、人間にとっては A と a は別の文字ですが、コンピュータの内部でもそれぞれ別の数値が割り当てられています。つまり、

  • A には A 用の数値
  • a には a 用の数値
  • あ には あ 用の数値

というように、文字ごとに対応する数値があるのです。

この 文字に対応する数値 のことを 文字コード といいます。

文字コードとは何か

文字コードとは、文字の形に対応づけられた数値のことです。

たとえば、ある文字コードの規則の中で、A にある数値が割り当てられ、a には別の数値が割り当てられているとします。すると、コンピュータはその数値を見て、どの文字を表すのかを判断できます。

この考え方を表にすると、次のようなイメージになります。

文字対応する数値の例コンピュータの見方
Aある決められた数値数値として管理する
a別の数値数値として管理する
さらに別の数値数値として管理する

つまり、文字コードは 文字をコンピュータが扱える数値に変換するためのルール だと考えるとわかりやすいです。

Javaでは Unicode が使われている

Javaでは、文字コードとして Unicode が使われています。

Unicode は、世界中のさまざまな文字を統一的に扱うための文字コード体系です。英字や数字だけでなく、日本語、記号、そのほか多くの文字を表せるように考えられています。

Javaが Unicode を使っているおかげで、私たちは日本語を含むさまざまな文字を比較的自然に扱うことができます。たとえば、Javaのコードの中で次のような文字を書くことができます。

'A'
'あ'
'春'
"こんにちは"

これらの文字も、内部では Unicode に基づく数値として扱われています。

Unicode のよさを簡単に整理すると、次のようになります。

特徴内容
多くの文字を扱える英字、数字、日本語、記号などを幅広く表せる
世界中の文字に対応しやすい多言語のプログラムでも扱いやすい
Javaと相性がよいJavaでは文字の基本的な扱いに使われている

エスケープシーケンスで文字コードを指定できる

Javaでは、エスケープシーケンスを使って文字コードを直接指定することができます。

代表的な書き方は次の2つです。

書き方意味
\ooo8進数で表した文字コードの文字
\uhhhh16進数で表した文字コードの文字

ここで大切なのは、これらは単なる数字の並びではなく、指定した文字コードに対応する文字を表す書き方だということです。

たとえば、

  • \101 は 8進数で表した文字コード
  • \u0061 は 16進数で表した文字コード

です。

このように書くと、Javaはその文字コードに対応する文字を出力します。

サンプルプログラムで文字コードを使ってみよう

ファイル名:Sample5.java

// 文字コードを使って文字を表示するプログラム
class Sample5
{
    public static void main(String[] args)
    {
        System.out.println("8進数102の文字は \102 です。");
        System.out.println("16進数0042の文字は \u0042 です。");
    }
}

このプログラムを実行すると、画面には次のように表示されます。

8進数102の文字は B です。
16進数0042の文字は B です。

この結果からわかるように、\102 や \u0042 のような文字コードの指定は、実行時に対応する文字へ変換されて表示されます。

1行目では 8進数の文字コードを使っている

まず1行目を見てみましょう。

System.out.println("8進数102の文字は \102 です。");

ここで使われている \102 は、8進数で表した文字コードです。この指定に対応する文字が B なので、画面には B が表示されます。

つまり、コードの中では \102 と書いてあっても、実行結果ではそのまま \102 と表示されるのではなく、対応する文字へ変換されるのです。

表示結果はこうなります。

8進数102の文字は B です。

2行目では 16進数の文字コードを使っている

次に2行目を見てみましょう。

System.out.println("16進数0042の文字は \u0042 です。");

ここで使われている \u0042 は、16進数で表した文字コードです。これに対応する文字も B なので、画面では B と表示されます。

結果は次のようになります。

16進数0042の文字は B です。

つまり、8進数でも16進数でも、最終的に同じ文字コードを表していれば、同じ文字が出力されることになります。

文字コードを指定すると文字が出力されるしくみ

ここで、文字コードを指定したときの流れを整理してみましょう。

たとえば \u0042 という記述があると、Javaはこれを 16進数の文字コード指定 だと読み取ります。そして、そのコードに対応する Unicode の文字を探し、画面に表示します。

流れとしては、次のように考えるとわかりやすいです。

  1. コードの中に \u0042 が書かれている
  2. Javaがこれを文字コードの指定だと判断する
  3. Unicode の対応表から該当する文字を見つける
  4. その文字 B を画面に表示する

つまり、文字コードを直接書くことでも、最終的には文字そのものを出力できるのです。

8進数と16進数は数値の表し方の違い

ここで出てきた 8進数 と 16進数 は、数値の表し方の違いです。

普段、私たちがよく使っているのは 10進数 です。これは 0 から 9 までの数字を使って数を表す方法です。一方で、8進数は 0 から 7 までを使い、16進数は 0 から 9 に加えて A から F も使って数を表します。

今の段階では、細かい計算方法まで覚えなくても大丈夫です。ここでは、

  • \ooo は 8進数で文字コードを表す書き方
  • \uhhhh は 16進数で文字コードを表す書き方

だと押さえておけば十分です。

簡単に整理すると、次のようになります。

表し方使う記号
10進数0〜9
8進数0〜7
16進数0〜9、A〜F

文字そのものを書く方法と文字コードで書く方法の違い

Javaでは、文字を表す方法はいくつかあります。たとえば、直接文字を書くこともできますし、文字コードで書くこともできます。

たとえば B を表したいとき、次のような書き方があります。

'B'
"\u0042"

また、文字列の中に埋め込むなら、

"文字は B です。"
"文字は \u0042 です。"

のようにも書けます。

この違いを表にすると、次のようになります。

書き方読みやすさ特徴
直接文字を書く高い何の文字かすぐわかる
文字コードで書くやや低い文字コードとの対応を意識できる

普段は直接文字を書くことのほうが多いですが、文字コードのしくみを理解するためには、文字コードで書く方法を知っておくことがとても役立ちます。

文字コードを知ると文字の扱い方が深く見えてくる

文字コードの考え方を知ると、文字はただ見た目で存在しているのではなく、コンピュータの中では数値として管理されていることが見えてきます。

これは、Javaで文字を学ぶうえでとても大切な視点です。たとえば、

  • なぜ文字にコードがあるのか
  • なぜエスケープシーケンスで文字を表せるのか
  • なぜ Unicode という仕組みが必要なのか

といったことが、少しずつつながって理解できるようになります。

つまり、文字コードを知ることは、文字の見た目の先にある コンピュータの考え方 を知ることでもあるのです。

この図では、文字コードと実際の文字が対応していることがひと目でわかります。コードの中では \102 や \u0042 のような形で書かれていても、Javaはそれを対応する文字 B として表示します。

この流れを見ることで、コンピュータが文字を直接扱っているのではなく、いったん数値として理解してから文字として見せている、という考え方がつかみやすくなります。

Sample5.java から学べる大切なこと

最後に、今回のサンプルをもう一度見てみましょう。

ファイル名:Sample5.java

// 文字コードを使って文字を表示するプログラム
class Sample5
{
    public static void main(String[] args)
    {
        System.out.println("8進数102の文字は \102 です。");
        System.out.println("16進数0042の文字は \u0042 です。");
    }
}

このサンプルから学べることを整理すると、次のようになります。

学べること内容
文字は内部で数値として扱われるコンピュータは文字コードで文字を管理する
Javaでは Unicode が使われる多くの文字を統一的に扱える
\ooo8進数で文字コードを指定できる
\uhhhh16進数で文字コードを指定できる
文字コードから文字を出力できる指定したコードに対応する文字が表示される

文字コードは、最初は少し抽象的に感じるかもしれません。ですが、エスケープシーケンスと結びつけて見ていくと、文字と数値がどのように対応しているのかがかなり見えやすくなります。文字をただ読むだけでなく、その裏側でコンピュータがどう扱っているのかまで意識できるようになると、Javaの文字の世界がより深く理解できるようになります。