凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 1384
  • トラックバック - 187
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

今回はけろさんの 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
コメント
  • # re: Javaとサロゲートペア
    けろ
    Posted @ 2007/07/29 23:28
    詳しい説明(カクテル)ありがとうございます。

    おっしゃる通りで、多言語対応を怠っていたシステムは、Vistaの登場によって、そのツケが回ってきています。

    サロゲートペアだとchar数が合わなくなりますので、
    古いシステムのVista対応で、調査させられている人が多いようです。
  • # re: Javaとサロゲートペア
    かつのり
    Posted @ 2007/07/29 23:37
    そういや、これから作るシステムでもVista対応入れました。
    対応っていってもサロゲートペアを含む場合は入力エラーにしています。
  • # re: Javaとサロゲートペア
    中博俊
    Posted @ 2007/07/30 10:55
    そういう対応はやめて~~~~>かつのりさん
  • # re: Javaとサロゲートペア
    凪瀬
    Posted @ 2007/07/30 11:53
    しかし、まじめにサロゲートペアの文字を処理できるようにするのは結構面倒なんですよね。
    業務要件として入力される文字種が特定できる場合はフィルタリングというのはコスト的に一番手っ取り早い方法かもしれません。
    しかしサロゲートペアと言った所で帳票以外では入力文字数制限に影響するぐらいかなぁ。
  • # re: Javaとサロゲートペア
    かつのり
    Posted @ 2007/07/30 12:30
    サーバ側のプログラムだけで文字数チェックを行うのはAPIがあるのでいいのですが、
    DBやらクライアントスクリプトレベルでは、
    なかなかナレッジがないというのが実情・・・

    ぶっちゃけ逃げるのが早いんですよね。悲しいのですが・・・
    早く全部の層で、一般常識として普及するといいですね。
  • # re: Javaとサロゲートペア
    れもん
    Posted @ 2010/05/12 0:56
    大手だとホストで固定長ファイルの連携なんかしてるところがたくさんあるので、Unicodeなんか使うと変換が大変。
    枠にめいっぱい詰め込む帳票なんかは、文字数より表示幅の方が重要。アメリカ人は文字がはみ出ても気にしないが、日本人は入力できるものが表示しきないことをバグと言います。
    要するにUnicodeは仕様が大味すぎる。
タイトル  
名前  
Url
コメント