Jcode - 日本語文字集合ハンドラ
use Jcode; # # 古式ゆかしく Jcode::convert($str, $ocode, $icode, "z"); # もしくはオブジェクト指向で! print Jcode->new($str)->h2z->tr($from, $to)->utf8;
Jcode.pmはオブジェクト的なアプローチと従来からのアプローチの両方を サポートしています。オブジェクト的なアプローチを使えばこんな感じで;
$iso_2022_jp = Jcode->new($str)->h2z->jis;
こちらよりエレガントでしょう:
$iso_2022_jp = $str; &jcode::convert(\$iso_2022_jp, 'jis', &jcode::getcode(\$str), "z");
オブジェクトに馴染みの無い人のために、Jcode.pmはまだgetcode()
と
convert()
をサポートしています。
Perlのバージョンが5.8.1以上なら、Jcodeは、Perl 5.8以降の標準的な文字集合 ハンドラモジュールであるEncodeのラッパーとして振る舞います。
特に言及しない限り、ここで挙げるメソッドは全てJcodeオブジェクトを返します。
Perl 5.8.1以降では、$icode
にはEncodeが理解できる
どんなエンコーディング名も使えます。
$j = Jcode->new($european, 'iso-latin1');
オブジェクトを文字列化すると、EUCに変換された文字列が返ります。ですから
print $j->euc
とする代わりに、print $j
とできます。
Jcode->new(\$str);
これはほんの少し時間を節約します。その代償として、$strの値そのものが 変換されます(ある意味、$strはjcodeオブジェクトに``tieされる''のです)。
# mailboxをSJIS形式に変換 my $jconv = new Jcode; $/ = 00; while(<>){ print $jconv->set(\$_)->mime_decode->sjis; }
new()
の短縮形。以下のようにできます;
$sjis = jcode($str)->sjis;
一般に、$j->encodedとすることでencodedに変換された文字列を得ます。
$j->h2z->jis
と同じです。
半角カナは強制的に全角に変換されます。
Perl 5.8.1以降では、Encodeがサポートするどんなエンコーディング名と エイリアスでも利用できます。例えば:
$european = $j->iso_latin1; # メソッド名用に'-'は'_'に置き換えます
参考:the Encode::Encoder manpageがこれと同じ小技を使っています。
fallback($fallback)
my $unistr = "\x{262f}"; # 陰陽マーク my $j = jcode($unistr); # $j->euc の結果は '?' に
この振る舞いは、Encode同様、フォールバックを指定することで変更できます。
値はEncodeのものと一緒です。便宜のため、Jcode::FB_PERLQQ
、
Jcode::FB_XMLCREF
、Jcode::FB_HTMLCREF
がEncodeのそれらへの
エイリアスになっています。
print $j->fallback(Jcode::FB_PERLQQ)->euc; # '\x{262f}' print $j->fallback(Jcode::FB_XMLCREF)->euc; # '☯' print $j->fallback(Jcode::FB_HTMLCREF)->euc; # '☯'
グローバル変数$Jcode::FALLBACK
にデフォルトのフォールバックが保持
されていますので、この値を代入することでオーバーライドできます。
$Jcode::FALLBACK = Jcode::FB_PERLQQ; # デフォルトのフォールバックスキーマを設定
$newline_str(デフォルトは``\n'')で指定された改行文字が加わります。 折り返された全行をリストで返します。
Perl 5.8.1以降は3番目の引数$krefにEUCの文字列の配列リファレンスを 渡すことで、簡易的な行頭禁則処理(ぶら下がり)を行えます。
下記のメソッドを使うには、the MIME::Base64 manpageが必要です。インストールは単純に
perl -MCPAN -e 'CPAN::Shell->install("MIME::Base64")'
とします。お使いのPerlが5.6以降であるなら、the MIME::Base64 manpageは バンドルされているので、インストールの必要はありません。
Perl 5.8.1以降では、以下のようにしてもMIME Headerエンコードができます:
$mime_header = $j->MIME_Header;
この場合$mime_header
の戻り値はMIME-B-encoded UTF-8になります。
一方、$j->mime_encode()
はMIME-B-encoded ISO-2022-JPを返します。
最近のほとんどのメーラーはどちらもサポートしています。
Jcode->new($str, 'MIME-Header');
こちらの場合、ISO-2022-JPだけではなくUTF-8などにも対応しており、 さらにMIME B EncodingのみならずMIME Q Encodingにも対応している ので、Perl 5.8.1以降であればこちらを使うべきでしょう。
h2z([$keep_dakuten])
$j->nmatchを通じてマッチした数を取得できます。
$j->nmatchを通じてマッチした数を取得できます。
->m()
と->s()
を使うには、Perl 5.8.1以降が
必要です。
tr/$from/$to/
を適用します。$fromと$toは
EUC-JPの文字列です。Perl 5.8.1以降では、flag付きのUTF-8文字列
も受け付けます。
$opt
をセットすると、tr/$from/$to/$opt
が適用されます。$opt
は
'c'、'd'あるいはそれらの組み合わせでなければなりません。
$j->nmatchを通じてマッチした数を取得できます。
Perl 5.8.1以降では、trの形式に誤りのあった場合に->error_trを通じて、 $@を取得できます。
以下のメソッドはPerl 5.8.1以降でのみ利用可能です。
s/$pattern/$replace/$opt
を適用します。$opt
は正規表現オプションと
同じです。正規表現のオプションについてはperlreを参照ください。
$j->tr("A-Z", "a-z")->s("foo", "bar");
m/$patter/$opt
を適用します。このメソッドは”オブジェクトを返さない”
ので、$j->s()
のようにメソッドを連結できないことに注意してください。
正規表現の形式に誤りのあった場合、->error_m、->error_sを通じて $@を取得できます。
もしJcodeオブジェクトのインスタンス変数にアクセスしたいなら、直接それら にアクセスするのではなく、アクセスメソッドを利用しましょう(これぞOOP です)。
参考までに、Jcodeは(一般的な方法である)ハッシュリファレンスの代わりに、 配列リファレンスを使うことで、スピードを最適化しています(実際のところ、 アクセスメソッドを使う限りこのことを知る必要はありません; もう一度 いいますが、これはOOPなのです)。
Perl 5.8.1以降では、ハッシュリファレンスを使うように変更されました。 これにより、Jcodeの拡張はものすごく簡単になります。
Perl 5.8.1以降ではUTF-8フラグの立ったUTF-8文字列へのリファレンスです。
getcode($str)
ascii Ascii (日本語コードを含まない) binary Binary (テキストファイルではない) euc EUC-JP sjis SHIFT_JIS jis JIS (ISO-2022-JP) ucs2 UCS2 (Raw Unicode) utf8 UTF8
スカラーコンテキストの代わりに配列コンテキストを使うと、何文字分の コードが見つかったのかも返します。上の方で述べたように、$strは\$str でも構いません。
jcode.pl 利用者の方へ: この関数はjcode::getcode()と100%上位互換が あります。――まあ、ほぼ100%;
* 戻り値が配列のとき、その順番は逆となります; jcode::getcode()は$nmatchを最初に返します。
* jcode::getcode()は、EUC文字とSJIS文字の数が等しいとき、'undef'を 返します。 Jcode::getcode()はEUCを返します。これはJcode.pmには 中間がないためです。
jcode.pl 利用者の方へ: この関数はjcode::convert()と100%上位互換が あります!
Perlが5.8.1以降の場合、JcodeはEncodeのラッパーとして振る舞います。 つまり、JcodeはEncode内のバグの影響を受けます。
このパッケージは、動機、デザインそしてコードの多くの点で、 歌代 和正 <utashiro@iij.ad.jp>氏のPerl4ライブラリjcode.plに負っています。
大崎 博基 <ohzaki@iod.ricoh.co.jp>氏は、開発の非常に初期の段階から 正規表現を磨きあげる手助けをしてくれました。
makamaka@donzoko.net の JEncode には、JcodeとEncodeをどう融合させれば いいか大変大きな啓示を受けました。また、本日本語マニュアルも寄贈して いただきました。
そしてJcode ML <jcode5@ring.gr.jp>の皆さん。この方達なしには、 ここまで完成しなかったことでしょう。
Encode
http://www.iana.org/assignments/character-sets
Copyright 1999-2005 Dan Kogai <dankogai@dan.co.jp>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.