ブログ

5.<アラビア語の⽂字表⽰のしくみ3>

こんにちは、カルチスタッフです。

前回に引き続き、パソコン上でアラビア語の単語を表⽰させる場合に、どのような仕組みで⽂字が表⽰されるのかを⾒ていきましょう。

アラビア⽂字には、【変形⽂字】・【結合⽂字】があるため、⼊⼒のUnicode と表⽰⽤のUnicodeが異なります。また、英数字と混在する場合にはUnicode の並び順も変わります。このことから、【⼊⼒Unicode 列から、表⽰⽤Unicode 列を導く】という観点に沿って説明をしたいと思います。

⼿順は次の3つです。
(1)、(2)で、【⼊⼒Unicode 列から、表⽰⽤Unicode 列を導く】処理を⾏い、【最後に⼦⾳字と⺟⾳記号の結合⽂字】を表⽰するための処理を(3)で⾏っていきます。

(1) Unicode を並べ替える(双⽅向処理)
(2)表⽰Unicode の決定(変形⽂字・⼦⾳字同⼠の結合⽂字)
(3)フォントファイルに収録されている情報に基づいて記号の位置を調整する

今回は、
(3)フォントファイルに収録されている情報に基づいて記号の位置を調整する
について説明したいと思います。

■フォントファイルに収録されている情報について■
フォントファイルには「GPOS」と呼ばれる⽂字位置調整情報が含まれています。
「GPOS」は「Glyph positioning data」の略です。ここでは、「グリフ位置調整情報」と呼びます。「グリフ位置調整情報」は、画⾯上に⽂字を表⽰するときの位置を⽰したものです。

ここではわかりやすいようにビットマップの⽂字で説明します。
たとえば、下の①、②のUnicode を⼊⼒して③の【⼦⾳字と⺟⾳記号の結合⽂字】を表⽰することを考えます。

20180730blog01⽂字にはそれぞれ幅があります。
単に並べて表⽰した場合、このようになります。

20180730blog02③のように結合⽂字を表⽰させるためには、2⽂字⽬を重ねて表⽰する必要があります。網掛けのところが重ねて表⽰している部分です。

20180730blog032⽂字⽬をどの位置に重ねるかは、2つの⽂字の形によって異なります。
下の図は、④と②の2⽂字が⼊⼒された場合に、⑤の【⼦⾳字と⺟⾳記号の結合⽂字】を表⽰する例です。上の例と、2⽂字⽬の重なる位置が違っているのがわかると思います。

20180730blog041⽂字⽬に対する、2⽂字⽬の表⽰位置を指定するための情報が「グリフ位置調整情報」です。
簡単に「グリフ位置調整情報」の中⾝を説明します。
下に⽰す表が「グリフ位置調整情報」⼀例です。ここでは「グリフ位置調整情報」の⼀部のみを紹介しています。「グリフ位置調整情報」のデータ数は、フォントにより⼤きく異なります。データ数が多いほど、きれいに重なる⽂字が多いことになりますが、フォントの容量が⼤きくなるデメリットもあります。

次に、表<GPOS データ例>をどのように使うかを説明します。
⼊⼒された単語中に、表の縦軸と横軸が連続する並びがあった場合、2⽂字⽬の表⽰位置を調整します。交点の数値分、表⽰位置を戻して、1⽂字⽬と重ねて表⽰します。

交点の数値は、⾼さ24dot のアラビア語フォントを使って⽂字を重ねる場合の値です。

<GPOS データ例>

20180730blog05「GPOS」についての説明は以上です。
それでは<GPOS データ例>に基づいて記号の位置を調整していきます。
記号の位置を調整した後、【R】グループ内のUnicode を逆順に並べかえる処理も⾏います。

まず、「キャンディー(120 円)」の例から説明していきます。

201807blog01

【記号の位置を調整する】処理前のUnicode 列はこうでした。

20180730blog06

この例には⺟⾳記号はありませんので、記号の位置調整は⾏いません。
【R】グループ内のUnicode を逆順に並べかえます。【表⽰Unicode の決定】処理対象外のUnicode 列もあわせて並べるとこのようになります。

20180730blog07

ここまでで、アラビア⽂字の表⽰処理は完了です。【⼊⼒Unicode 列から表⽰のグリフを導く】ことができました。

次に「広告」の例を⾒ていきます。

201807blog02【記号の位置を調整する】処理前のUnicode 列はこうでした。

20180730blog08<GPOS データ例>に照らし合わせてみます。
1・2⽂字⽬:<GPOS データ例>の縦軸に0xFE87 が、横軸に0x0650 があるので、
2⽂字⽬の始点を交点の数字である1dot 分ずらして重ねて表⽰する。
2・3⽂字⽬:<GPOS データ例>の縦軸に0x0650 がないので0xFECB は重ねない。
3・4⽂字⽬:<GPOS データ例>の縦軸に0xFECB が、横軸に0x0652 があるので、
2⽂字⽬の始点を交点の数字である1dot 分ずらして重ねて表⽰する。
4・5⽂字⽬:<GPOS データ例>の縦軸に0x0652 がないので0xFEFC は重ねない。
5・6⽂字⽬:<GPOS データ例>の縦軸に0xFEFC がないので0xFEE5 は重ねない。
6・7⽂字⽬:<GPOS データ例>の縦軸に0xFEE5 が、横軸に0x064C があるので、
2⽂字⽬の始点を交点の数字である2dot 分ずらして重ねて表⽰する。

まとめるとこのようになります。

20180730blog09次に【R】グループ内のUnicode を逆順に並べかえます。

20180730blog10重ねて表⽰する⽂字をまとめてみると上図のようになります。
ここまでで、アラビア⽂字の表⽰処理は完了です。【⼊⼒Unicode 列から表⽰のグリフを導く】ことができました。

ここまで3回に渡ってアラビア語の⽂字の表⽰のしくみについて説明してきました。

3.<アラビア語の⽂字表⽰のしくみ1>
4.<アラビア語の⽂字表⽰のしくみ2>
5.<アラビア語の⽂字表⽰のしくみ3>

カルチが提供するアラビア語レイアウトエンジン作成ガイドは今まで説明した内容をベースに、より詳しい説明を加えたドキュメントです。
⽂字の種類や組み合わせ⽅などをわかりやすく表にしているので、アラビア語の知識がなくてもアラビア語表⽰プログラムを作成することができます。

アラビア語フォントについてご質問・ご相談などございましたら、お気軽にお問い合わせください。

 

カルチスタッフ

関連記事

カルチ発行書籍

  1. KEISコードブック_表紙
    2016年1月15日にKEISコードブックを発売しました。
ページ上部へ戻る