WisdomSoft - for your serial experiences.

2.3 字句変換とUnicode

文字コードと Unicode の概要、及び Java のソースコード内で利用できる Unicode エスケープを紹介します。

2.3.1 Unicodeエスケープ

この場では、少しだけコンピュータと文字の関係について解説します。なぜならば、Java は国際化に柔軟に対応したプラットフォームであり、これには様々な国の文字の関係が大きく関与しているからです。

コンピュータの世界では、あらゆるものが2進数として表現されています。それは、文字も例外ではありません。例えば 1=A 、2=B というように、数値と文字を関連付ければ、デジタルに文字を表現することができます。しかし、この数値と文字の関係を、皆がバラバラに決めていては、あるプログラムの文書が別のプログラムでは利用できないという大変面倒なことになってしまいます。そこで、国際的に、どのコンピュータでも文字データは統一して扱うことができるように規格が定められました。これが、いわゆる文字コードです。

最も代表的なのは ANSI(American National Standard Institute、米国規格協会) が 1962 年に制定(ANSI X3.4)した American Standard Code for Infomation Interchange 通称 ASCII コードです。ASCII コードは 7 ビットで構成され、英数字を表現することができます。ASCII コードの特徴は 1 バイトで 1 文字を表現することができ、世界中のコンピュータで使用されています。

しかし、ASCII のような1バイトコードでは、日本語や中国語のような、多くの文字を使う言語に対応することができませんでした。そこで、各国独自の文字コードが誕生しました。日本語では JIS、Shift JIS、日本語 EUC などが存在します。しかし、こうした文字コードの乱立は文書を扱うプログラムを複雑にするばかりでなく、他国語への移植作業なども困難にしました。

そこで、世界中の文字を統一された文字コードで表現することの重要性が理解されるようになり、Microsoft や IBM などの米国企業が中心となって提唱したのが Unicode です。Unicode は、世界中の言語に対応する文字コードとして作られました。ISO(International Organization for Standardizatio、国際標準化機構) で国際規格 ISO/IEC 10646 の一部として標準化されています。 ASCII とは異なり、すべての文字を 2 バイトで表現する点がポイントです。

Java 言語はどこでも動くということが最大の売りですが、マシン環境だけでなく、世界のさまざまな国の言語環境も Unicode で記述することによって解決しています。事実、Java は Unicode と共に歴史を歩んでいます。Unicode のバージョンが新しくなるたびに、Java もそれに合わせて対応してきたのです。今後も Java は Unicode と歩調を合わせるでしょう。

Unicode の話をしましたが、Java 言語は ASCII だけでプログラムできるように設計されています。Unicode をソース内で使用したい場合、Unicode を使う以外に、ASCII コードを使った Unicode エスケープを利用するという方法があります。例えば、実装で適切なフォントが利用できない場合、Unicode 文字を表示するために Unicode エスケープを利用することができます。Unicode エスケープは次のように記述します。

Unicode エスケープ
\uXXXX

XXXX には、Unicode を表す 4 桁の 16 進数を指定します。本書は Unicode の専門書ではないので、Unicode がどのようにマッピングされているのかについては解説いたしません。

Unicode エスケープはソース内のあらゆる場所に指定することができます。コンパイル時には、最初に Unicode エスケーープが調べられ、Unicode へと変換されます。この工程を字句変換と呼びます。

コード1
class Test {
	public static void main(String args[]) \u007B
		System.out.println("\u732B\u304C\u597D\u304D");
	\u007D
}
実行結果

コード1では、例えば \u007B と \u007D がコード内に用いられています。これは括弧 { } に対応した Unicode エスケープで、字句変換によって何よりも優先して変換されるため、コンパイラが解析を行うときには { } と認識されます。そのため、このプログラムを正しくコンパイルすることができたのです。

また、println() メソッドによって出力する文字列にも 4 つの Unicode エスケープを利用しています。これは「猫が好き」という文字に変換されます。

初心者には、国際化アプリケーションの開発などは縁遠い話かもしれませんし、Unicode などは知らなくても問題なく開発することができることも事実です。しかし、文字列の中でうっかり Unicode エスケープ \u を使ってしまうと予想外の結果になってしまったりするかもしれないので、覚えておく必要があります。もちろん、Unicode エスケープを使ったソースを解析するときなどにも役に立つでしょう。