本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Pangoの接続: 第1回

すべての言語でテキスト・レイアウトを可能にするフレームワーク

Tony Graham (tkg@menteith.com), Senior consultant, Mulberry Technologies
Tony Graham氏はUnicode: A Primer (IDG Books Worldwide社、2000年3月出版、ISBN: 0764546252) の著者です。この本は、Unicode規格とその使用法について現在のところ唯一の著書です。日本では「Unicode標準入門」という邦題で、翔泳社の翻訳版が入手可能です。同氏は、オーストラリア人で、Unicode Consortiumの専門家メンバーです。メール・アドレスはtkg@menteith.com です。

概要: Pangoは、国際化されたテキストをレイアウトおよびレンダリングするためのオープン・ソースのフレームワークです。次世代のGTK+ とGNOMEに組み込まれることになっています。2回シリーズの第1回では、Tony GrahamがPangoを紹介するとともに、Pangoがテキストを処理する方法、およびフォーマットするテキストに指定できるテキスト属性を説明します。記事の末尾には、単純なテキスト・ストリングをフォーマットおよびレンダリングするためのPangoの処理パイプラインの要約、ならびにその属性のリストを示します。

日付:  2001年 3月 01日
レベル:  初級 この記事の原文:  英語
アクティビティー: 3130 ビュー
お気軽にご意見・ご感想をお寄せください: 


Pangoは、国際化されたテキスト (右から左に読み進むスクリプトや、タミール語などのようにグリフがコンテキストに依存するスクリプトを含む) をレイアウトおよびレンダリングするためのオープン・ソースのフレームワークです。驚くべきことではありませんが、Pangoは内部的にUnicode文字を使用します (UTF-8で表現)。さらに、PangoのインターフェースもUTF-8を使用します。処理前に、GNUの iconv などの変換ライブラリーを使用してテキストをUTF-8に変換しておけば、他のエンコード方式もサポートできます。

Pangoは、モジュラー式の、複数のプラットフォームや複数のツールキットにまたがる低レベルのライブラリーとして設計されており、複数のコンテキストで使用できます。PangoはGTK+ およびGNOMEプロジェクトと密接に関係しています。Pangoプロジェクトが始まったのは、GTK+ およびGNOMEで高品質の国際化テキストを使用する必要があったためです。Pangoは単独でも使用できますが、現行のPango (0.13) は、現在鋭意開発中のGTK+ の開発ブランチ1.3.xバージョンに組み込まれることになっています。Pangoは最終的にGTK+ 2.0に統合されることになっています。

"Pango" という名前は、"すべて" を意味するギリシャ語の "Pan" (Παν) と、"言語" を意味する日本語の "Go" (語) に由来しています。

GTK+ とGNOMEとは何か

GTKはGIMP Toolkit の略です。GTK+ は関数ライブラリーであり、その目立った特色としては、GIMP Drawing Kit (GDK) の低レベル関数にオブジェクト指向のフレーバーを加えるというものがあります。GDKは、低レベルのXライブラリーのプログラミングを単純化する関数のライブラリーです。


GNOMEは、デスクトップ環境とプログラミング・ライブラリーの両方を指す名前です。GNOMEアプリケーションは、デスクトップ・ウィジェットとのインターフェースを取るために、GNOMEライブラリーに定義されているオブジェクトと関数を使用します。アプリケーションは、GTK+ 関数の呼び出し、さらにはGDK、X、あるいは低レベルのglibまたはC関数への呼び出しさえ混用できます。

GTK+ とGNOMEは、Cで書かれているにもかかわらず、オブジェクト指向です。オブジェクト指向はCに本来備わっているものではありませんが、ライブラリーは規則によってオブジェクト指向を実現しています。すなわち、構造体はオブジェクトを表し、構造体への参照はそのスーパークラスを表します。また、オブジェクトのプロパティーの変更と新しいオブジェクトの作成は、適切なメソッドを呼び出すことによって行われます。このすべてはプログラマーにとって制限となりますが、結果コードの移植可能性は向上します。Cコンパイラーはほとんどすべてのプラットフォームにあるからです。それに加えて、GNOMEとGTK+ に対する、他の言語 (オブジェクト指向のものも、そうでないものも) からのインターフェース・バインディングが定義されてきました。


なぜUTF-8か

PangoインターフェースのストリングはUTF-8です。その理由は、既存の8ビット・ソフトウェアとの互換性、UNIXプラットフォームでの普及の度合い、0面以外の文字を処理するための余分の努力が不要であること、およびバイト順の心配がないことにあります。

UTF-8ストリングのオフセットは、文字単位ではなくバイト単位で数えます。Pangoの文書は、UTF-8が可変長であるためにストリング内の文字を数えるのがより困難になることを認める一方で、Unicodeにおいてはストリング内の場所を占めないマークのために、たとえ固定幅のエンコード方式であっても、文字位置とストリングの対応が断ち切られるとも述べています。

Pangoの文書は、CJKVの表意文字の場合、UTF-8がUTF-16に比べて50%のオーバーヘッドを持つことも認めています。


UCS-4同様の単一文字

単一文字は32ビットで表現されます。これは、ISO/IEC 10646で定義されるあらゆる文字との上位互換性を持たせることを考慮に入れたものです。最近、ISO作業委員会は、そのうちの100万だけ、つまりUTF-16でまかなえるコード・ポイントを使用することを確約しましたが、その削減された範囲でさえ21ビットを要します。32ビットというのは依然、語のサイズの標準として2番目に大きなものです。


BiDiライブラリー

Pangoは、Dov GrobgeldによるFriBidiインプリメンテーションによるUnicodeの両方向アルゴリズムを使用します ( 参考文献 を参照)。本稿執筆時点で、ライブラリーの現行バージョンはUnicode 2.1.8文字データベースを基にしているため、Unicode 3.0で追加されたThaanaなどをサポートしていません。 --with-fribidi オプションを指定してPangoをコンパイルすると、Pangoのソースのコピーが使用されます。このオプションを指定しない場合は、GrobgeldのWebサイトから最新版を入手して、代わりに使用することができます。


言語その他の属性

右から左へ読み進むテキストの処理に加えて、Pangoは言語タグの指定をサポートしています。したがって、たとえば日本語としてマークされたテキストには、日本語のフォントを使用しようとします。言語タグの指定は、すべてのPangoのテキスト属性タグの指定と同様、Pango特有の体系に従います。言語タグの指定にあたっては、Unicodeの14面言語タグも使用しませんし、W3Cの定義した xml:lang 属性も html:lang 属性も関係ありません。ただし、他の言語マークアップ体系からPangoの言語属性への変換は容易に行えるかもしれません。

以下のリストに、Pangoのテキスト属性の一覧を示します。

  • 言語
  • フォント・ファミリー: フォント・ファミリーの名前、または複数のファミリーをコンマで区切ったリスト
  • スタイル: 標準、斜字体、またはイタリック
  • 太さ: 極細から極太まで6つの値を指定可能
  • 異体: 標準または小型大文字
  • 伸縮: 超圧縮から超拡張まで9つの値を指定可能
  • サイズ: フォント・サイズ (1000分の1ポイント単位)
  • フォントの説明: 特定のフォント・ファミリー、スタイル、異体、太さ、伸縮、およびサイズを表す簡単なラベル
  • 前景色
  • 背景色
  • 下線: テキストに単一、二重、または低い線で下線を付けるかどうか
  • 取り消し線: テキストに取り消し線を付けるかどうか
  • 上昇: 垂直方向の変位
  • 形状: グリフに課す形状
  • スケール

以下の2つの図は、Pangoの実行例を示しています。最初の図ではドイツ語、ギリシャ語、ヘブライ語、日本語、およびアラビア語テキストが使用されており、2番目の図では、それに加えてフランス語、韓国語、およびロシア語が使用されていることに注目してください。当然のことながら、ドイツ語とフランス語のラベルとテキスト・ボックスは、英語またはヨーロッパのコンピューター・システムの大部分で容易に実現可能です。しかし、これらの言語に加えて、図に示されている言語を組み合わせて処理できるようなコンピューター・システムは、ずっとまれです。


スタイル設定された、複数言語による両方向テキスト
複数言語による、両方向に向かう、スタイル設定されたテキストの例

ウィジェット・ラベル内の複数言語
ウィジェット・ラベル内の複数言語

テキスト属性のマーキング

文字のシーケンスのさまざまな属性 (言語を含む) は、テキストとは別個に、構造体のリストとして保守されます。属性タイプが異なる各スパンごとに1つの構造体が用いられます。各構造体は、単一の属性クラス、およびそのクラスが適用される文字範囲の開始地点と終了地点を示します。特定の属性タイプの場合、追加情報によってこれが拡張されています。たとえば、カラー属性の場合、スパンに適用される赤、緑、および青のカラー・コンポーネントも記録されます。

テキスト (ウィジェット・ラベルなど) のために別個の属性リストを作成することができますが、属性の変更が多数ある場合、これは骨の折れる作業となることがあります。さらに、Pangoの文書が述べるとおり、属性の付いたオリジナルのテキストを後から翻訳する場合、各属性の構造体の文字範囲は確実に無効になります。

特に翻訳者の便宜を図って、Pangoはテキストに属性の変更を組み込むための単純なHTML風のマークアップ言語をサポートしています。それとともに、マークアップ・テキストを、プレーンなストリングと別個の属性リストに変換するための pango_parse_markup() 関数を備えています。ルート・エレメントは <markup> ですが、これは省略可能です。(開始タグと終了タグを両方とも省略できますが、一方だけ省略するとエラーになります。)

最も用途が広く、最も一般的に使用されるエレメントは <span> です。同名のHTMLエレメントと同様、これはテキストのスパンをマークします。この開始タグには以下の属性を含めることができます。その値はPangoのテキスト属性値に変換されます。

  • font_desc : フォントの簡単な記述。"Sans Italic 12" など (他のスパン属性がある場合、これは変更されます)
  • font_family : フォント・ファミリー名。
  • face : font_family 属性と同義。
  • size : フォント・サイズ (1000分の1ポイント単位)。 xx-small または xx-large などの事前定義されている絶対サイズを表すキーワードか、相対サイズを表す smaller または larger のどちらか。
  • style : normaloblique 、または italic のいずれか。スタイル・テキスト属性の許容値に対応。
  • weight : 6つのキーワード ( ultralightnormal 、または heavy など) か、太さを表す数値。
  • variant : normal または smallcaps
  • stretch : 伸縮テキスト属性の許容値に対応する9つのキーワードのうちの1つ ( ultracondensednormal 、および ultraexpanded など)。
  • foreground : #00FF00 などのRGBカラー指定か、 red などのカラー名。
  • background : #00FF00 などのRGBカラー指定か、 red などのカラー名。
  • underline : singledoublelownone のいずれか。
  • rise : 垂直方向の変位 (Mの字の10000分の1単位)。添え字の場合は負の値、肩文字の場合は正の値とすることができる。
  • strikethrough : テキストに取り消し線を付けるかどうかに応じて、 true または false
  • lang : 言語コード ( fr など)

マークアップ言語には、属性を持たない便利なエレメントも少数含まれています。

  • <b> : 太字
  • <big> : <span size="larger"> と等価
  • <i> : イタリック
  • <s> : 取り消し線
  • <sub> : 添え字
  • <sup> : 肩文字
  • <small> : <span size="smaller> と等価
  • <tt> : モノスペース・フォント
  • <u> : 下線

size 属性による絶対サイズと相対サイズの連続的な増減、および <bigger> または <smaller> の各エレメントによるサイズの増減の割合は、1:1.2 (または1.2:1) です。これはCSSの文字サイズのスケール因数と同じです。

HTMLとは異なり、マークアップ言語には大文字小文字の区別があります (この点ではXMLに似ています)。省略可能なタグは、 <markup> の開始タグと終了タグの対だけです。


パイプラインで

Pangoはフォーマット設定とレンダリングを段階的なパイプラインによってインプリメントします。

以下の例はThe Unicode Standard, Version 3.0 の第3章とUAX #9の両方で使用されていたものを基にしたものですが、ここで、大文字は、アラビア語やヘブライ語のように、右から左に読み進むテキストを表しています。この例のマークアップにより、テキストのある部分には下線が引かれ、別の部分は青色になり、また別の部分は下線が引かれると同時に青色になります。

<u>car </u><span foreground="blue"><u>is </u>THE CAR</span> in Arabic
			

属性のマークアップは単なる便宜上の機能に過ぎず、パイプラインはテキストとPango属性のリストがないと始まりません。したがって、上記の例を入力として pango_parse_markup() を呼び出すことが、言うなればステップ0にあたります。その結果として、単一のストリングが戻されます。このストリングには、テキストと2つのPango属性が含まれています。一方の属性は青いテキストのスパンを示し、もう一方の属性は下線が引かれるテキストのスパンを示します。以下の表は、これらのスパンを示しています。

ストリング car is THE CAR in Arabic
前景色  Blue  
下線 True   

項目化

パイプラインの最初のステップは、ストリングを分割して、一貫した属性を持つ部分に分けることです。これには、言語タグが一貫している部分、両方向のカテゴリーが一貫している部分、カラーが一貫している部分などが含まれます。以下の表は、各部に分割された単純なストリングを示しています。表の "Bidiレベル" は、スパンのUnicode両方向組み込みレベルです。偶数 (0を含む) は左から右に読み進むテキスト、奇数は右から左に読み進むテキストを表します。

ストリング car is THE CAR in Arabic
前景色  Blue Blue  
下線 True True   
Bidiレベル0010

並べ替え

次いで、項目が目に見える順序に並べ替えられます。以下の表に示すとおりです。

ストリング car is RAC EHT in Arabic
前景色  Blue Blue  
下線 True True   
Bidiレベル0010

グリフの選択

次いで、Pangoは各項目の文字に適したグリフを選択します。

位置調整

グリフのストリングが位置調整されます。たとえば、以前の で示したように、右から左へと位置調整されます。

レンダリング

グリフが出力装置へレンダリングされます。Pangoはレンダリング・システムではありませんが、Xフォント用のレンダリング・ルーチンが組み込まれています。他の出力装置の場合は、他の外部レンダリング・ルーチンが必要になります。以下の表は、例がレンダリングされるとどのように見えるかを示しています。

car is RAC EHT in Arabic

Pangoについてさらに

連載の第2回では、コード例を示すとともに、Pangoがグリフを選択してテキストをレンダリングする方法について説明します。


参考文献

著者について

Tony Graham氏はUnicode: A Primer (IDG Books Worldwide社、2000年3月出版、ISBN: 0764546252) の著者です。この本は、Unicode規格とその使用法について現在のところ唯一の著書です。日本では「Unicode標準入門」という邦題で、翔泳社の翻訳版が入手可能です。同氏は、オーストラリア人で、Unicode Consortiumの専門家メンバーです。メール・アドレスはtkg@menteith.com です。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Open source, Linux
ArticleID=239761
ArticleTitle=Pangoの接続: 第1回
publish-date=03012001
author1-email=tkg@menteith.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。