今回はけろさんの
Vistaとサロゲートペア
のアレンジとなるカクテルをお出ししましょう。
JavaSE5.0からはUnicode4.0に対応しています。
Unicode4.0のリリースが2003年4月(だと思うけど自信がない)なのに対し、
5.0のリリースが2004年4月ですのでおよそ1年で対応が盛り込まれたことになります。
さて、このblog執筆時点ですでに5.0リリースから3年以上が経っているわけです。
私はこの間、サロゲートペアに対する悲鳴を聞いた覚えがありません。
Javaだと問題がないのでしょうか?
実はあまり影響がないのです。これはSunの努力の賜物といえるでしょう。
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/index_ja.html
Unicode4.0で変わったこと
サロゲートペアの影響でUnicodeでのコードポイントとcharでの表現が一致しなくなりました。
charはUTF-16コード単位を表すという仕様となったのです。
そのためU+20BB7(つちよし。吉野家の吉の部分。土の下に口)といったコードポイント表記からcharへの変換には
java.lang.Character#toChars(int) : return値はchar[]型
を利用します。
しかし、通常のI/Oではすでにchar化されUTF-16になってしまっています。
この変換を独自にしなくてはいけない場所というはレアなケースでしょう。
java.lang.Characterにはコードポイントに対応した各種メソッドが用意されました。
javacコンパイラなどの文字解析などを行うプログラムはjava.lang.Characterに定義された
Unicode4.0に対応した各種メソッドを利用する必要があるかもしれません。
Character#toLowerCase(int)などの大文字/小文字変換などのメソッドは引数がchar型の
旧来のものと別に引数がintのオーバーロードが追加されています。
java.lang.Stringにもコードポイントに対応したメソッドが追加となっています。
サロゲートペアを含むStringのlength()は文字数とはなりません。
String#length()はUTF-16コード単位での長さを返すという仕様となりました。
サロゲートペアを1文字としてカウントしたい場合はString#codePointCount()を用います。
どういう場所で問題が起きるのか
Sunのガイドラインから抜粋しますと、
個々の文字を独自に解釈するアプリケーション、個々の文字を Java プラットフォーム API に渡すアプリケーション、
個々の文字を返すメソッドを呼び出すアプリケーションのうち、補助文字を取り扱う可能性のあるアプリケーションの場合に限り、
補助文字をサポートするための変更をアプリケーションに加える必要があります。
char シーケンスを取り扱う類似 API を使用できる場合は、そのような API を使用するようにアプリケーションを変更するのが最善策です。
それ以外の場合は、新しい API を使用して、char 型による表現をコードポイントによる表現に変換した後、
コードポイント用 API を呼び出す必要があります。
というように、影響は非常に限定的のように思えます。
しかし、これと別に問題になりそうな箇所があります。それは帳票です。
もっとも、これはサロゲートペアに限った話ではありません。
もとより合字というものがありますので、char[]とした場合の長さと表示領域の長さは一致しないのです。
Shift_JIS時代のように横幅と表示幅が一致するのは太古の昔の話です。
そもそも、帳票という観点で言えば、システムがUnicodeとなった時点で日本語以外の文字が混入してくるようになっているのです。
それらの表示幅をどうするの?切り捨てるの?という話題はJavaの出た当初で片付いていなければ成らない問題なのです。
これは日本語の入力のみを想定しているけども、そのようなフィルタリングをしていないよ、という類の問題なのですが、
日本のシステムは日本国内での消費が殆どですからよほど意地悪な(もしくは優秀な)テスターでもない限り、
非日本語を入力して問題が発生するなど気が付かないかもしれませんね。
しかし、Vistaが出るまで、そもそもサロゲートペアで現される文字が表示できるようなフォントが普及していませんでした。
今後Vistaの普及とともにこれらの文字による入力が自然と行われるようになると、あるいは今更のように多言語対応を
怠ってきたツケが回ってくるのかもしれません。
あるとすれば、入力文字を日本語に限定していたにもかかわらず、char数と横幅が合わなくなる、という部分かもしれません。
投稿日時 : 2007年7月29日 21:16