« GetCharacterPlacementとカーソル配置 | トップページ | GetCharacterPlacementの続き »

2007年6月 1日 (金)

Unicodeと双方向テキスト

今回は双方向テキストである。初めに、自分はこの方面に詳しくないので、用語の使い方や説明が適切でないかもしれないのでご勘弁を。また、詳しいことは別のサイトにお任せするとして、ここでは、Windows絡みのお話を。

Unicodeは世界の様々な国・地域で使われる言語のスクリプトを収録した文字コードの規格であるが、Unicodeを使ってプログラミングを始めると、日本人には馴染みの薄い問題に出くわす。その中の一つにテキストの双方向性がある。日本語を読み書きする方向はは通常左から右(縦書きというのもあるが)であるが、アラビア語やヘブライ語は通常、数字は左から右、その他の部分は右から左に読み書きする。で、Unicodeを使ってこれら複数のスクリプトが混在するテキストを自前で正しく表示・処理するとなるとややこしい。

WindowsではXP以降標準のAPIでこららコンプレックススクリプト(Complex Script)を正しく処理できるようになったそうなので、それを確かめてみる。(ちなみに、XP以前でもUniscribe(Unicode Script Processor)というAPIを使用すれば、コンプレックススクリプトを正しく処理できるそうであるが、詳しい事はここでは割愛する)

まずは、扱うテキストは次の図のテキストである。

Bidi1

これは、17のコードポイントで表されるテキストを1コードポイントずつ左から右に並べて表示したときの図である。両端の英語の「Hello」「World」のフレーズの間にアラビア語のフレーズがはさまれているテキストである。

次に、このテキストを正しく方向を考慮して表示したときの図が下の図である。

Bidi2

これは、Uniscribeを使いUnicode双方向アルゴリズムにしたがって、テキストを表示したときの図である。分かりずらいかもしれないが、両端の英語の部分は左から右へ、中央のアラビア語の部分は右から左に表示されている。つまり、中央の部分はテキストのメモリ上での格納順序である論理順序(Logical Order)とテキストの表示順序(Visual Order)が一致しないのである。

で、これらを元にWindowsの標準テキストAPIであるExtTextOutを使って(ETO_GLYPH_INDEXなし)で表示してみる。

まずは、Windows2000上での結果から。

Bidi3

先ほどの結果と照らしあわせれば分かると思うが、方向が考慮されず、中央のアラビア語の部分も両端の英語の部分と同様、左から右に表示されている。

次は、WindowsXP上での結果。

Bidi4

上の図のように、Uniscribeの結果と同じように、中央のアラビア語の部分が右から左に表示されている。

ちなみに、Unicodeでは、文字ごとに文字の方向属性という属性が定められていて、それらはWindowsAPIのGetStringTypeExを使って取得することができる。

« GetCharacterPlacementとカーソル配置 | トップページ | GetCharacterPlacementの続き »

Windows」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1497665/39651882

この記事へのトラックバック一覧です: Unicodeと双方向テキスト:

« GetCharacterPlacementとカーソル配置 | トップページ | GetCharacterPlacementの続き »

自作ソフトウェア

無料ブログはココログ

メモ