« 2008年9月 | トップページ | 2008年12月 »

2008年10月

2008年10月12日 (日)

MLang(Multilingual Language)の続き(3)・・・IMLangCodePages

今回はIMLangCodePagesインターフェース。

IMLangCodePagesは与えられたUnicode文字または文字列を含むコードページ集合(a set of code pages)を求めるメソッドを提供する。また、個々のコードページ識別子とコードページ集合間の変換を行うメソッドも提供する。コードページ集合は、32ビット符号無し整数(DWORD)として表現され、32ビット符号無し整数の各ビットが特定のコードページに対応する(コードページ集合にコードページが含まれていれば、そのビットが1にセットされる)。各ビットがどのコードページに対応するかはドキュメント化されていないが、IMLangCodePagesインタフェースのCodePagesToCodePageCodePageToCodePagesメソッドを使って、コードページ集合に含まれている各コードページを次のように求めることができる。

Unicode文字または文字列からそれらコードページ集合を求めるにはGetCharCodePagesGetStrCodePagesメソッドを使う。

ということで実際にこれらのメソッドを使ってコードポイントがU+0000からU+FFFFまでの範囲の各Unicode文字のコードページ集合を次のコードのような感じで求めてみる(サロゲートペアや結合文字は通常単独では使われない等細かい事は考えないbearing)。

実行結果は次の通り。

Mlang3_1

上の画像より、U+3042の「あ」(KATAKANA LETTER A)のコードページ集合に、シフトJISを表すコードページ932に含まれていることがわかる。また、簡体字中国語のGB2312を表すコードページ936も含まれているが、ネットで検索するとどうやらGB2312に日本語の平仮名や片仮名などの文字が含まれているらしい・・

次に、U+FF71の「ア」(HALF WIDTH KATAKANA LETTER A)のコードページ集合を見てみる。

Mlang3_2

半角はさすがにGB2312などに含まれていないか・・・

最後に、U+0041の「A」(LATIN CAPITAL LETTER A)。

Mlang3_3

案の定、U+0000からU+007Fの範囲はASCIIと互換であるので、ほとんどの各国語キャラクタセットに含まれているってことかな??

以上。

2008年10月11日 (土)

MLang(Multilingual Language)の続き(2)・・・IEnumCodePage,IEnumRfc1766

前回の続きであるが、今回はIEnumCodePageIEnumRfc1766インターフェースについて。

IEnumCodePage、IEnumRfc1766インターフェースはMIMEデータベースからそれぞれコードページ、ロケールを列挙するインターフェースで、列挙オブジェクトであるCode Page EnumerationオブジェクトLocale Enumeration オブジェクトによって実装されていて、そのメンバであるNext,Skip,Resetのメソッドを使って、次の項目を取得(Next)、次の項目をスキップ(Skip),列挙位置をリセット(Reset)する事ができる。

そして、これらのインターフェースは、IMultiLanguage::EnumCodePages、IMultiLanguage::EnumRfc1766メソッドを呼び出してそのポインタを取得できる。

ということで実際に使ってみる。

まずは、IEnumCodePageから。

Mlang2_1

::EnumCodePagesメソッドを呼び出す時にFlagsパラメータで列挙するコードページを制御できるのだそうだが、ややこしそうなので深くは立ち入らない。上の画像で日本語EUCのエントリが見つかったりもする。

コードは次のような感じ。

続いて、IEnumRfc1766。

Mlang2_2

コードは次のような感じ。

以上。

2008年10月10日 (金)

MLang(Multilingual Language)

今回はMLangについて。MLang(Multilingual Language)は、国際化・多言語の環境に存在する問題を開発者が解決するのを助ける様々なサービスの集合で、これらによって開発者は国際化・多言語の環境における様々な問題を取り扱えるようになる。また、WindowsのCOM(Component Object Model)を使ってインプロセスサーバとして実装されている(MLang.dll)。MLang.dllはインターネットエクスプローラ4.0以上と共に配布されているので、今日の環境においてMLang.dllが存在しないと言った事は稀であると思われる。

MLangによって提供される機能は次のようになる。

  • MIMEデータベースからのコードページとロケールの列挙(IEnumCodePage,IEnumRfc1766)
  • コードページ、ロケール、キャラクタセットの情報の取得(IMultiLanguage)
  • 異なるキャラクタセット間のキャラクタセット変換
  • 与えられた文字または文字列を含むコードページの決定(IMLangCodePages)
  • 文字列データから使われている可能性のあるコードページ、言語の決定(IMultiLanguage)
  • 様々なキャラクタセットからの文字を一度に表示するためのカスタムフォントの作成(IMLangFontLink)
  • コンソールベースのアプリケーションのためのロケールに基づいた行分割(IMLangLineBreakConsole)

と、色々な便利な機能が提供されているのだが、これらの内のいくつかを実際に使ってみる。上記の括弧内は主に使用するインターフェースである。また、上記の機能を利用するには、最初にMultiLanguageオブジェクトというオブジェクトを作成する。MultiLanguageオブジェクトはMLangによって実装される他の全てのオブジェクト(Code Page EnumerationオブジェクトLocale Enumerationオブジェクトなど)とインターフェースへのアクセスを提供する。MultiLanguageオブジェクトによって実装されているインターフェースは次のようになる。

  • IMLangCodePages
  • IMLangFontLink
  • IMLangFontLink2
  • IMLangLineBreakConsole
  • IMultiLanguage
  • IMultiLanguage2

MultiLanguageオブジェクトを作成するにはCLSIDパラメータにCLSID_CMultiLanguageを指定してCoCreateInstanceを呼び出す。

Delphiで利用する場合はこんな感じ。

注:CreateComObjectは内部でCoCreateInstanceを呼び出すDelphiのラッパー関数である。

今回はここまで。

2008年10月 8日 (水)

コードページの続き(3)・・・コードページの列挙(EnumSystemCodePages)

以前といっても1年以上前にコードページに関する事を書いたが(ここここ)、今回はコードページの列挙について。EnumSystemCodePages関数で、システムにインストールされているコードページまたはシステムによってサポートされているコードページを列挙できる。このEnumSystemCodePages関数の使い方は他の列挙する関数ど同様、アプリケーション定義のコールバック関数のポインタを引数に取る。詳細は簡単なのでSDKを参照

ということで、以前の記事で作ったプログラムを改造してEnumSystemCodePages関数を使ってコードページを列挙してみる。Windows2000上でサポートされているコードページを列挙(CP_SUPPORTED)した結果は次の通り。

Enumsystemcodepages1

133個のコードページが列挙された。これと「コントロールパネル」->「地域のオプション」->「システムの言語設定」->「詳細」で表示される「地域の詳細オプション」ダイアログに列挙されるコードページ変換テーブルの一覧と比較したのだが、微妙に違っているorz・・・

Enumsystemcodepages2

まぁ、ここでは余り深く考えるのはやめて、次に列挙されたコードページ識別子(Code Page Identifier)に対応する文字セット識別子(Charset Identifer)をTranslateCharsetInfo関数を使って求めてみる。文字セット識別子は例えば、CreateFont関数で論理フォントを作成する時にLOGFONT.lfCharsetフィールドに指定するやつです。

実行結果は次のとおり。

Enumsystemcodepages3

上の画像より例えば、日本語のシフトJISを表すコードページ932に対応する文字セットは128のSHIFTJIS_CHARSETであることが分かる。

以上。

些細なプログラムであるが作ったプログラムはここ

« 2008年9月 | トップページ | 2008年12月 »

自作ソフトウェア

無料ブログはココログ

メモ