ウムラウト (Umlaut) などの欧州言語用フォントを VB で表示する

(C) boco_san ( ぼこさん) 2009/Dec/

1. 目 的

  ウムラウトのような文字を画面に表示するには,どうすればよいでしょうか ?
  HTML で表示するには,文字実体参照や文字数値参照 (Unicode) が使えます。
         ¿Cómo?     Ist das möglich?    Ich weiß nicht.     comme ça.
  この通りです。 簡単ですね
   でも,VB アプリケーションからこれらの文字を表示するには ?
  SBCS ( 1バイト文字セット) では,何の問題も無いのですが,日本語 Windows のように DBCS ( 2バイト文字セット) を 使うシステムでは,これが単純ではありません。
  これに対処する方法を,5 個の EXE ファイル (VB6) を実行しながら考えましょう。
  実行ファイルは,UmlautVB.zip, UmlautVB.lzh の ルートディレクトリにあります。
  このどちらかを開いて,ファイルを実行しながら,以下をお読み下さい。
  もしもお気に入りましたら,ソースファイルをダウンロードして,あなたの VB プログラムに組み込んでお使い下さい。

2. 何が問題か ?

  Unicode の 0x20〜0xFF には,このような文字が割り当てられています。
  0x20〜0x7E は ASCII 文字ですが,拡張文字 0x81〜0x9F, 0xE0〜0xFC は, 漢字の先行バイトと重なっており, これらの文字を VB から Print することはできません。
  たとえば,“ça” と Print したいとき,
   Print & Chr(&HE7) & "a"
と書いてみます。
  ところが,Chr(&HE7) は Shift-Jis の先行バイトにあたるので,システムがこれを勝手に Chr(0) で置き換えてしまいます。
   よく知られた現象ですが,上のファイルを開いて,その中の (1) PrintVB255.EXE を実行してみましょう。
   フォントをどれに選んでも,0x80〜0xFF の文字全部を表示することはできません。

3. マイクロソフト

  DBCS では 欧州言語対応が難しいという問題点ですが, マイクロソフトは,Wingdings と 呼ばれる絵文字 ( たとえば ëìíî ) が 一部表示できないことを気にしたようで, “DBCS システムで拡張 ASCII WingDings を表示する方法”(2004/07/01) を公開しています。
   これを ( 1 行の脱落を補って ) 実行してみましょう。 à (2) WingdingsMS.EXE.
   なるほど,さっきは部分的にしか表示できなかった Wingdings が全部見えています。
   この方法は,SYMBOL_CHARSET で Wingdings フォントを (その場で) 定義し, WinAPI の TextOut を呼び出すというものです。

4. 他のフォントも ?

   それなら,他のフォントも ANSI_CHARSET で定義して使えば,0x80〜0xFF を すべて表示できるはずです。
   では, à (3) Uni255.EXE を実行してみましょう。
   Wingdings だけでなく,Webdings も全部見えています。
   Arial, Times, そして Symbol も。
   4 種類のフォント装飾も OK です ( Bold, Italic, Underline など ).

5. VB アプリケーションへの実装

  ここまで,分かれば,この仕組みを利用して,VB アプリケーションで 上記の 0x80〜0xFF フォントを表示できます。
   これを実現したのが,(4) TryUse.EXE です。 これも,今ここで実行してみましょう。
   ここで注意を要するのは,表示したい文字列の受け渡し方法です。
   前述のように,Chr を使うと文字化けが起こります。
   したがって,Byte データの配列により,表示したい文字列を渡します。
   TryUse.EXE のトップのテキストボックスのようにバイトデータ列を渡すと,これが素直に表示されます。
   今ここで,このテキストボックスに自分で何か書き加えて,表示してみましょう。
   たとえば,“e7 61 2e” と書き加えると,“ça.” と表示されます。

   もちろん,これでは実用になりません。
   何らかのテキストで渡す必要があります。
   その際,もちろん,0x20〜0x7E の文字しか使えません。
   ここでは,実際的な方法として,HTML の文字実体参照をそのまま利用します。
   これが,画面中央のテキストボックスです。
   HTML ファイルを書き慣れている人は,すぐに分かるでしょう。
   今ここで,HTML 文字実体参照に従って何かテキスト入力し,試してみましょう。
   たとえば,Ä   を付け足すと,大文字のウムラウト Ä が表示されます。

6. 実装の方法

   お気に入りましたか ?
   あなたの VB プログラムに組み込む必要があるのは,1 個のモジュール
       UmlautVB.bas
   です。 この中に含まれる大切な手続きは,次の 2 個です。
    (1) Sub PutString( Obj As Object, Strg As String, X As Long, Y As Long)
    (2) Sub TxtWdHt(Obj As Object, Strg as String, txtWidth As Long, txtHeight As Long)
   前者は,オブジェクト Obj の位置 (X,Y) に文字列 Strg を表示します。
   X の値は,CurrentX と同様に進みます。
   後者は,それを表示した場合のサイズ (幅と高さ) を取得します。
  フォントのプロパティは,Name, Size, Bold, Italic, Underline, Strikethrough がそのまま引き継がれます。 また,色は,そのオブジェクトの ForeColor がそのまま使用されます。
  要するに,Print, TextWidth, TextHeight と同じように使えます。
  0x80〜0xFF の文字は,HTML の文字実体参照によりエンコードします。
  たとえば,
     ¿Cómo está usted?   ⇒   ¿Cómo está usted?
  という具合です。
   注意を要するいくつかの文字を表にまとめておきます。

表示したい文字 & " -   \   ¥
必要な表記 & "   -   − ¥¥
  練習として,いろいろな文を表示してみて下さい ( ⇒ (5) Exercise.VBP ).

   なお,Symbol や Wingdings フォントでは,バイトデータを渡します。
   その場合の同様な SUB として,PutBytes, ByteWdHt が用意されています。   

  このようにして,私のソフトウェア ミニハンドは,欧州五ヶ国語 (スペイン,ポルトガル,イタリア,ドイツ,フランス) に対応しています。

7. 日本語と欧州語の共存するテキストファイル

   ここまで できると,日本語とドイツ (フランス,スペイン,イタリア, … ) 語が共存するテキストを作れます。
   そのためには,HTML 文字実体参照と欧州言語のあいだの変換が必要です。
   これを実現するのが,同梱のソフトウェア (6) EncodeDocode.Exe です。
   ここから先は,ファイルの読み書きをするので,このパッケージをダウンロードして,実行して下さい。
   参考ファイルとして,Lorelei.Dat, AuClair.Dat という 2 個のファイルが入っています。
   これらは,0A, 0D, 20-FF 文字を使って ドイツ語 / フランス語 で書かれています。

  1. はじめに,ShowFile をクリックして これらのファイルを選択し,表示してみましょう。
    このとき,二つの画面が開きます。一つは,VB でそのまま表示したもの (Original) です。 案の定,文字化けします。
    もう一つの画面 OutPut は,バイナリで読んで,上記の PutBytes により表示します。
      こちらは,ウムラウトもアクサンも正しく表示されます。
  2. 次に,このテキストを日本語と共存させる目的で,HTML 文字実体参照を利用してエンコードしましょう。
    それには,Encode をクリックして,たとえば,Lorelei.Dat を選択します。
    このとき,画面は何も応答しませんが,Lorelei.Txt が作成されます。
  3. これを確かめるには,ShowFile をクリックします。
    画面中央のファイルボックスに Lorelei.Txt が見えるので,これを選択します。
    ここでも,やはり 2 つの画面が開きます。
    ひとつ (Original) は,エンコードされたファイルそのままです。
    もう一つの画面 OutPut は,これを上述の PutString により表示したものです。
  4. これだけでは,面白くありません。
    これに,近藤朔風による訳詞を添えました。それが,LoreleiJ.txt です。
    画面 Original では,このようにドイツ語と日本語が共存しています。こういうファイルを作れば,画面 OutPut のように 表示できます。
  5. 逆変換も可能です。
    Decode をクリックして,LoreleiJ.txt を選択すると,もとのドイツ語へ戻ります。
    Decode の際には日本語を取り入れることができないので,日本語部分は切り捨てられます。
    日本語を含む LoreleiJ.txt を Decode した結果 (LoreleiJ.Dat) が Lorelei.Dat と一致するかどうか …。ファイル比較をお楽しみに。
  6. 上記の Encode では,0x22 を " ではなく,そのままにします。
    1 MB 程度のファイルも容易に Encode します。
   以上のようにして,日本語と欧州諸言語 (フランス,ドイツ,スペイン,イタリア,スウェーデン,etc) が共存するファイルを VB で扱うことが可能です。

Valid HTML 4.01 Transitional (C) boco_san ( ぼこさん)
inserted by FC2 system