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

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

1. 目 的

  ウムラウトのような文字を画面に表示するには,どうすればよいでしょうか ?
  HTML で表示するには,文字実体参照や文字数値参照 (Unicode) が使えます。
      ¿Cómo?     Ist das möglich?    Ich weiß nicht.     comme ça.
  この通りです。 簡単ですね
  でも,VB アプリケーションからこれらの文字を表示するには ?
  SBCS (1バイト文字セット) では,何の問題も無いのですが,日本語ウィンドウズのように 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, Strikethrough ).

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 が用意されています。

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


(C) boco_san (ぼこさん)