Hippo2000 (2000/12/9)
Unicode系モジュールの1つUnicode::Mapなのです。
作者はMartin Schwartzさんです。メールで許可をいただきました。
Unicode::Map V0.108 - utf16ユニコードへの/からの文字セットのマップ
use Unicode::Map();
$Map = new Unicode::Map("ISO-8859-1");
$utf16 = $Map -> to_unicode ("Hello world!"); => $utf16 == "\0H\0e\0l\0l\0o\0 \0w\0o\0r\0l\0d\0!"
$locale = $Map -> from_unicode ($utf16); => $locale == "Hello world!"
さらに詳しい説明が以下にあります。
2do: perlのUnicodeの見通しについての短い注意書き
この文字列は2バイトUnicode UCS2フォーマットから/へ変換します。すべてのマッピングは、1バイトUTF8エンコーディングではなく、2バイトUTF16エンコーディングを介して行われます。これらへの変換にはUnicode::Stringをお使いください。
歴史的な理由からこのモジュールはUnicode::Map8と共存しています。2バイト文字セット、例えば中国語 GB2312、に注意を払う必要がなければ、Unicode::Map8 をお使いください、もし基本的な機能にこだわれば(ドキュメントをご覧ください)、両方のモジュールを同じように使うことができます。
実際にはperlのコアになんらかの方法によるUnicodeマッピングサポートが必要なので、このモジュールは遅かれ早かれなくなってしまうでしょう。もしこの分野で働きたいのであれば、Gisle Aasにコンタクトするのを躊躇しないでください。
このモジュールはutf8を直接扱うことができません。utf8からutf16へ、そしてその反対はUnicode::Stringを使ってください。
文字マッピングはUnicode::Map階層にあるバイナリ・マップファイルのデータに従います。バイナリ・マップファイルはこのモジュールを使って作り、独自の特定の文字セットをインストールすることができます。mkmapfileか、Unicode::Map階層にあるファイルREGISTRYをご覧ください。
おそらくこれらだけが、このモジュールで必要とするメソッドかもしれません。これらの使い方はUnicode::Map8と互換性があります。
GB2312-80のための新しいMapオブジェクトを返します。
utf16エンコードされている文字列$srcから、その文字セットの文字列を作成します。
$srcからutf16表現での文字列を作成します。
定数 WARN_DEFAULT, WARN_DEPRECATION または WARN_COMPATIBILITYで、Unicode::Mapに非難されるあるいは互換性のない使用方法で警告(warning)を発するように命令することができます。後のものはorすることができます。
注意;これらのメソッドはUnicode::Mapの管理のためだけにあります。これらのいずれかを使うとUnicode::Map8との互換性がなくなります。
$csid文字セットの別名のリストを返します。
Unicode::MapのREGISTRYファイルにしたがって、文字セット$csidのためのバイナリ文字マッピングの絶対パスを返します。
"" = $Map
-> id ($test_id) もし$test_idがUnicode::MapのREGISTRYファイルにしたがって正しい文字セット名または別名であれば、適切な文字セット識別子$real_idを返します。
ids()
REGISTRYファイルで定義されているすべての文字セット名を返します。
1||0 = $Map ->
read_text_mapping ($csid, $path, $style)
形式(style)が$styleで名前が$csidのテキスト・マッピングを読み込みます。マッピングはwrite_binary_mappingメソッドでファイルに保存することができます。$styleには以下のものが設定できます。
style 説明
"unicode" ftp://ftp.unicode.org/MAPPINGS/ のテキストマッピング "" "unicode"と同じ "reverse" unicodeと同じ。しかし2つのカラムが逆。 "keld" ftp://dkuug.dk/i18n/charmaps/ のようなテキスト・マッピング
Unicode::MapのREGISTRYファイルにしたがって、文字セット$csidのためのテキストの文字マッピングのパスを返します。
Unicode::MapのREGISTRYファイルにしたがって、文字セット$csidのためのテキストの文字マッピングの形式を返します。
1||0 = $Map ->
write_binary_mapping ($csid, $path) ファイル$pathにread_text_mappingメソッドによりロードされたマッピングを格納します。
いくつかの機能は、もはや面倒みません。
バイナリ・マップファイルの構造
Unicode文字マッピング・テーブルは順番のキーと順番の値コードの並びを持っています。このプロパティは簡単にマップを圧縮するために使われます。n(0<n<256)の順番の文字はバイトカウントnを表します。そして最初の文字コード key_startを表します。これらの後の続きも一緒に圧縮されます。値0は拡張された情報ブロックを開始するために使われます(しかし、これは部分的にだけ実装されています。)
バイナリ・マップファイルを作成するには2つの方法があります。最初の方法は、まずすべてのキーとなるコードのリストを書き込み、そしてすべての値のコードを書込むこと。2番目の方法、ここではこちらを使っています、は圧縮された値コードリストに従って部分的なキーのコードをつけることです。この方法により、値のコードを少しだけキーとなるコードに近づけます。
注意:ファイル・フォーマットはまだ流動的です。このままであるとか、説明が間違っていないとか、すべての機能が実装されていると信頼し凪いでください。
構造:
offset structure value
0x00 word 0x27b8 (マジック) 0x02 @(<extended> || <submapping>)
mapfile_endsはmainストリームでのextendedモード<end>で終ります
0x00 byte != 0 charsize1 (bits) 0x01 byte n1 1つのエントリに対する文字の数 0x02 byte charsize2 (bits) 0x03 byte n2 1つのエントリに対する文字の数 0x04 @(<extended> || <key_seq> || <key_val_seq)
bs1=int((charsize1+7)/8), bs2=int((charsize2+7)/8)
1つのsubmappingは<mapend>エントリがあると終わりです。
0x00 size=0|1|2|4 n, 順番の文字の数 size bs1 key1 +bs1 bs2 value1 +bs2 bs1 key2 +bs1 bs2 value2 ...
key_val_seqはファイルの終わりか(n = inifiniteモード)またはnの組み合わせを読みこんだときに終ります。
0x00 byte n, 並んでいる文字の数 0x01 bs1 key_start, 並びの最初の文字 1+bs1 @(<extended> || <val_seq>)
キーの並びは後ろにどれくらい長い並びがついているかのバイトカウントで始まります。その後ろにはキー開始コードがつきます。この後ろには値並びのリストがきます。値並びのリストはsum(m)がnと一緒になったら終わりです。
0x00 byte m, 並んでいる文字の数 0x01 bs2 val_start, 並びの最初の文字
0x00 byte 0 0x01 byte ftype 0x02 byte fsize, 以下の構造体の大きさ 0x03 fsize bytes 何らかのもの
将来の拡張あるいはプライベートな使用ために、1..255バイトの長さのストリームを入れることができます。ftypeには30..255の値を持つことができます。0..29は予約済みです。Modiは今のところ十分には定義されていません。これらについては後で説明します。
mirrorMappings(1)Martin Schwartz <martin@nacho.de>
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。