Unicode::Map8 v0.10

Hippo2000 (2000/12/10)

Unicode系モジュールの1つUnicode::Map8です。

作者はGisle Aasさんです。メールで許可を申請中ですが著作権の内容から公開しても問題ないと判断しました。


目次


名前

Unicode::Map8 - 8ビット文字とUnicodeの間のマッピング・テーブル


概要

 require Unicode::Map8;
 my $no_map = Unicode::Map8->new("ISO646-NO") || die;
 my $l1_map = Unicode::Map8->new("latin1")    || die;
 my $ustr = $no_map->to16("V}re norske tegn b|r {res\n");
 my $lstr = $l1_map->to8($ustr);
 print $lstr;
 print $no_map->tou("V}re norske tegn b|r {res\n")->utf8

説明

Unicode::Map8 クラスは8ビット文字セットとUnicodeのような16ビット文字セットの間の効率的なマッピング・テーブルを実装しています。テーブルは占有する空間の面と変換スピードの両方の面から効率的です。16ビット文字列はネットワーク・バイド・オーダを使用すると仮定しています。

以下のメソッドを利用できます:

$m = Unicode::Map8->new( [$charset] )
オブジェクト・コンストラクタはUnicode::Map8クラスの新しいインスタンスを作成します。それでマッピングを初期化する8ビット文字セットの名前を指定するオプションの引数をとります。引数はマッピング・ファイルの名前も指定することができます。文字セット/ファイルを探し出すことができなければ、コンストラクタはundefを返します。

引数を省略すると、空のマッピングテーブルが構築されます。以下で説明されるaddpair() を使ってマッピング・ペアを追加しなければなりません。

$m->addpair( $u8, $u16 );
マッピング・オブジェクトに新しいマッピング・ペアを付かします。これは2つの引数をとります。1番目は8ビット文字セットでのコード値、2番目が対応する16ビット文字セットでのコード値です。同じコードを複数回使うことができます(しかし同じ組を使っても何も効果はありません)。そのコードへの最初の定義が使われます。

以下の例について考えてみましょう:

  $m->addpair(0x20, 0x0020);
  $m->addpair(0x20, 0x00A0);
  $m->addpair(0xA0, 0x00A0);

これは8ビット文字セットでの0x20と0xA0という文字は、16ビットでそれ自身にマップされることを意味します。しかし16ビットでは0x0A0は0x20にマップされます。

$m->default_to8( $u8 )
16ビットから8ビット文字列へのマッピングのときに使われるデフォルトの文字のコードを設定します。ある文字に対するマッピングの組がなければ、このデフォルトがto8()とrecode8()によって置き換えられます。
$m->default_to16( $u16 )
8ビットから16ビット文字列へのマッピングのときに使われるデフォルトの文字のコードを設定します。ある文字に対するマッピングの組がなければ、このデフォルトがto16(), tou() そしてrecode8()によって使われます。
$m->nostrict;
すべての未定義のマッピングは同一のマッピングによって置き換えられます。文字セットの変換のさいに、未定義の文字は通常通りに削除されます(もしくはデフォルトが定義されていれば、それで置き換えられます)。
$m->to8( $ustr );
16ビット文字の文字列を対応する8ビット文字セットの文字列に変換します。
$m->to16( $str );
8ビット文字の文字列を対応する16ビット文字セットの文字列に変換します。
$m->tou( $str );
to16() と同じ。しかしプレーンなUCS2文字列の代わりにUnicode::Stringオブジェクトを返します。
$m->recode8($m2, $str);
文字列$strを8ビット文字セット($m)から、他のもの($m2)にマップします。共通の16ビット・エンコーディングを知っているものと仮定しているので、これを使ってすべての8ビット文字セットを変換できます。
$m->to_char16( $u8 )
1つの8ビット文字コードを16ビットコードにマップします。もし8ビット文字がマップされていなければ、定数NOCHARが返されます。デフォルトは使われず、コールバック・メソッドも呼ばれません。
$m->to_char8( $u16 )
1つの16ビット文字コードを8ビットコードにマップします。16ビット文字がマップされていなければ、定数NOCHARが返されます。デフォルトは使われず、コールバック・メソッドも呼ばれません。
 

以下のコールバック・メソッドを利用することができます。Unicode::Map8のサブクラスを作ることにより、これらのメソッドをオーバーライドすることができます。

$m->unmapped_to8
8ビット文字セットの文字列へのマッピングのときに、マッピングが(そしてデフォルトも)定義されていなければ、このメソッドが最後の砦として呼ばれます。これは1つのsingle integerの引数で呼ばれ、それはマップされていない16ビット文字のコードです。これは8ビット文字列に合体させられる文字列を返すことが期待されます。このデフォルトのバージョンは常に空の文字列を返します。

例:

 package MyMapper;
 @ISA=qw(Unicode::Map8);

 sub unmapped_to8
 {
    my($self, $code) = @_;
    require Unicode::CharName;
    "<" . Unicode::CharName::uname($code) . ">";
 }
$m->unmapped_to16
同様に16ビット文字セットの文字列へのマッピングのときに、マッピングが定義されていなければ、このメソッドが呼ばれます。これはネットワーク・バイト・オーダーのバイトを持つ16ビット文字列を返さなければなりません。このデフォルトのバージョンは常に空の文字列を返します。

ファイル

Unicode::Map8 コンストラクタは2つの異なるファイル・フォーマットを解析することができます;バイナリ・フォーマットとテキスト・フォーマットです。

バイナリ・フォーマットは単純です。それにはネットワーク・バイト・オーダーでの16ビット integerのペアの並びから構成されます。最初のペアには特殊な値0xFFFE, 0x0001が入っていなければなりません。各ペアでは最初の値が8ビット文字の値、2番目が16ビット文字のコードです。これに従えば、最初の値は256よりも小さくなければなりません。

テキスト・フォーマットはコメント(最初の空白でない文字が'#')、完全なる空行もしくは2つの16進数を持つ行のいずれかである行により構成されます。16進数の頭にはCやPerlのように"0x"がつかなければなりません。これは <URL:ftp://ftp.unicode.org/Public>から利用できるUnicodeマッピング・ファイルと同じフォーマットです。

マッピング・テーブル・ファイルはPerl @INCパスのどこかのUnicode/Map8/maps ディレクトリにインストールされます。変数$Unicode::Map8::MAPS_DIRがこのディレクトリへの完全なパス名です。バイナリ・マッピング・ファイルはこのディレクトリに、末尾が.binで格納されます。テキスト・マッピング・ファイルは末尾が.txtで格納されます。

map8_bin2txtmap8_txt2bin は、これらのマッピング・ファイル・フォーマットを変換します。

$MAPS_DIRにある、aliasesという特殊ファイルは、さまざまな文字セットを示すために使われる別名をすべて指定します。各行の最初の名前が実際のファイル名で、残りは空白で区切られた別名です。

'umap --list' コマンドはサポートされている文字セットの一覧を出すために使われます。


バグ

Unicodeサロゲート・ペアを1つの文字として扱いません


参考資料

umap(1), the Unicode::String manpage


著作権

(原文のまま)

Copyright 1998 Gisle Aas.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。