開発者向けUnicode FAQ--もう知らないではすまされない

杉山貴章(オングス)
2012-02-09 11:27:00
  • このエントリーをはてなブックマークに追加

Unicodeの正規化ってなに?

 Unicodeでは複数の文字の符号表現を組み合わせて1つの文字として扱うことができる。例えば「が」を、「か」と「゛」の組み合わせでも表現できるということだ。しかしこの性質は、『「が」と「か」+「゛」が等しいかどうか』を判定する際に問題となる。そこで、プログラムにおいてこのような文字が等しいかどうかを判別できるようにするのが「Unicodeの正規化」である。

 Unicode Standard Annex #15では、4種類の正規化形式が規定されている。プログラムで厳密にUnicode文字の比較を扱う場合には正規化を考慮しなくてはならない。

文字数とデータサイズの関係は?

 Shift_JISやEUC-JPなどの2バイト文字コードの場合、1文字が2バイトの固定長であるため、データサイズから容易に文字数を類推することができた。しかしUnicodeの場合には、UTF-32を除いて1符号単位あたりのデータサイズが可変なので、文字数を調べるためには全データを読み取る必要がある。文字列上の位置から単純に「何文字目か」を類推することもできないため、内部の処理が複雑になるという問題がある。

「波ダッシュ」がやっかいって聞いたんだけど

 「波ダッシュ(U+301C、"~")」は、Unicodeに関連する代表的な問題として有名だ。Windowsと、Mac OSなどWindows以外の環境では、波ダッシュを含むUnicodeデータをやりとりする際に文字化けなどの問題が起こる可能性がある。

 これはWindowsのShift_JISとUnicodeのマッピングテーブルにおいて、Shift_JISの波ダッシュ(0x8160)がUnicodeの全角チルダ(U+FF5E)に割り当てられてしまっているためである。

 マッピングに関する問題は他にもある。有名なのは「Yen Sign問題」と呼ばれるもので、これはShift_JISやEUC_JPなどの円記号("¥")がUnicodeではバックスラッシュ("\")に変わってしまうという問題である。Shift_JISの円記号は0x5Cに割り当てられているが、0x5CはASCIIコードでバックスラッシュに相当するもので、プログラムの制御コードとしても使われるため、素直にUnicodeの円記号(U+00A5)として扱ってしまうと既存のプログラムに影響が出る可能性があるからだ。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]