Unicode::Map V0.108

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と互換性があります。

new
$Map = new Unicode::Map("GB2312-80")

GB2312-80のための新しいMapオブジェクトを返します。

from_unicode
$dest = $Map -> from_unicode ($src)

utf16エンコードされている文字列$srcから、その文字セットの文字列を作成します。

to_unicode
$dest = $Map -> to_unicode ($src)

$srcからutf16表現での文字列を作成します。

to8
from_unicodeのための別名。Unicode::Map8との互換性のため。
to16
to_unicodeのための別名。Unicode::Map8との互換性のため。

警告

定数 WARN_DEFAULT, WARN_DEPRECATION または WARN_COMPATIBILITYで、Unicode::Mapに非難されるあるいは互換性のない使用方法で警告(warning)を発するように命令することができます。後のものはorすることができます。

No special warnings:(特別な警告はなし)
$Unicode::Map::WARNINGS = Unicode::Map::WARN_DEFAULT
Warnings for deprecated usage:(非難される使用方法についての警告)
$Unicode::Map::WARNINGS = Unicode::Map::WARN_DEPRECATION
Warnings for incompatible usage:(互換性のない使用方法について警告)
$Unicode::Map::WARNINGS = Unicode::Map::WARN_COMPATIBILITY

管理用メソッド

注意;これらのメソッドはUnicode::Mapの管理のためだけにあります。これらのいずれかを使うとUnicode::Map8との互換性がなくなります。

alias
@list = $Map -> alias ($csid)

$csid文字セットの別名のリストを返します。

mapping
$path = $Map -> mapping ($csid)

Unicode::MapのREGISTRYファイルにしたがって、文字セット$csidのためのバイナリ文字マッピングの絶対パスを返します。

id
$real_id||"" = $Map -> id ($test_id)

もし$test_idがUnicode::MapのREGISTRYファイルにしたがって正しい文字セット名または別名であれば、適切な文字セット識別子$real_idを返します。

ids
@ids = $Map -> ids()

REGISTRYファイルで定義されているすべての文字セット名を返します。

read_text_mapping
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/ のようなテキスト・マッピング
src
$path = $Map -> src ($csid)

Unicode::MapのREGISTRYファイルにしたがって、文字セット$csidのためのテキストの文字マッピングのパスを返します。

style
$path = $Map -> style ($csid)

Unicode::MapのREGISTRYファイルにしたがって、文字セット$csidのためのテキストの文字マッピングの形式を返します。

write_binary_mapping
1||0 = $Map -> write_binary_mapping ($csid, $path)

ファイル$pathにread_text_mappingメソッドによりロードされたマッピングを格納します。


非難されるメソッド

いくつかの機能は、もはや面倒みません。

noise
非難されます!もう使わないで下さい。
reverse_unicode
非難されます!代わりにUnicode::String::byteswapを使ってください。

バイナリ・マッピング

バイナリ・マップファイルの構造

Unicode文字マッピング・テーブルは順番のキーと順番の値コードの並びを持っています。このプロパティは簡単にマップを圧縮するために使われます。n(0<n<256)の順番の文字はバイトカウントnを表します。そして最初の文字コード key_startを表します。これらの後の続きも一緒に圧縮されます。値0は拡張された情報ブロックを開始するために使われます(しかし、これは部分的にだけ実装されています。)

バイナリ・マップファイルを作成するには2つの方法があります。最初の方法は、まずすべてのキーとなるコードのリストを書き込み、そしてすべての値のコードを書込むこと。2番目の方法、ここではこちらを使っています、は圧縮された値コードリストに従って部分的なキーのコードをつけることです。この方法により、値のコードを少しだけキーとなるコードに近づけます。

注意:ファイル・フォーマットはまだ流動的です。このままであるとか、説明が間違っていないとか、すべての機能が実装されていると信頼し凪いでください。

構造:

<main>:
   offset  structure     value
   0x00    word          0x27b8   (マジック)
   0x02    @(<extended> || <submapping>)

mapfile_endsはmainストリームでのextendedモード<end>で終ります

<submapping>:
   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>エントリがあると終わりです。

<key_val_seq>:
   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の組み合わせを読みこんだときに終ります。

<key_seq>:
   0x00    byte          n, 並んでいる文字の数
   0x01    bs1           key_start, 並びの最初の文字
   1+bs1   @(<extended> || <val_seq>)

キーの並びは後ろにどれくらい長い並びがついているかのバイトカウントで始まります。その後ろにはキー開始コードがつきます。この後ろには値並びのリストがきます。値並びのリストはsum(m)がnと一緒になったら終わりです。

<val_seq>:
   0x00    byte          m, 並んでいる文字の数
   0x01    bs2           val_start, 並びの最初の文字
<extended>:
   0x00    byte          0
   0x01    byte          ftype
   0x02    byte          fsize, 以下の構造体の大きさ
   0x03    fsize bytes   何らかのもの

将来の拡張あるいはプライベートな使用ために、1..255バイトの長さのストリームを入れることができます。ftypeには30..255の値を持つことができます。0..29は予約済みです。Modiは今のところ十分には定義されていません。これらについては後で説明します。


やらなければならないこと

- ある文字が変換の必要がないときに、何か賢いこと
 
- 文字セット->文字セットへの直接のマッピング
 
- パフォーマンスを上げる
 
- RFC1345に従ったマッピングのサポート

参考資料

- perlライブラリ・パスのUnicode/Mapディレクトリに入っているREGISTRYファイルとバイナリ・マッピング
 
- recode(1), map(1), mkmapfile(1), Unicode::Map(3), Unicode::Map8(3), Unicode::String(3), Unicode::CharName(3), mirrorMappings(1)
 
- RFC 1345
 
- Unicodeコンソーシアムでのマッピング ftp://ftp.unicode.org/MAPPINGS/
 
- 登録されているインターネット文字セット ftp://dkuug.dk/i18n/charmaps/
 
- 2do: さらなるリファレンス

作者

Martin Schwartz <martin@nacho.de>


ホーム Perlの小技

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