Kawa.netxp 日本語処理・携帯絵文字処理関係のPerlモジュール

日本語を含む多言語処理(主にUTF8、Shift_JIS、ISO-2022-JP。 その他にLatin1、EUC-JP、EUC-KR、Big5、GB2310などにも対応)や、 DoCoMo・SoftBank・au に対応した携帯絵文字処理関連のモジュール群です。

これらのモジュールは、CGI / mod_perl 環境どちらでも利用できます。
Perlのバージョンは5.005以降で利用できます。(5.6.1、5.8.xを含む)

ダウンロード

CodeRepos に最新ソースコード(とはいえ2005年9月13日版)を移動しました。
CodeRepos 上で書き換えていただいてOKですッ!

安定版アーカイブ: i18n-emoji.20050913.tar.gz TGZ   i18n-emoji.20050913.zip ZIP

最新版ソースコード: http://svn.coderepos.org/share/lang/perl/misc/i18n-emoji/ SVN

レンタルサーバ・ホスティングサーバなど、root 権限を使用できなかったり CPAN からのモジュールインストールのできない環境でも、利用できます。

更新履歴

各モジュールとこのページの主な更新履歴です。

2007/12/30

2005/09/13

2005/04/22

2005/02/02

2004/11/23

CGIparamJP.pm モジュール POD

CGI.pm のサブクラスで、クエリ中の日本語処理を行います。

set_param_charset メソッドが追加されており、 クエリ変数の文字コードの自動判別・自動変換を行います。 それ以外は通常の CGI.pm と全く同じように利用できます。 クエリ変数の値の取り出しは通常通り param メソッドを利用します。 CGI.pm との違いは、new 後に一度だけ set_param_charset を呼ぶ点のみです。

    use CGI;                    # クエリ入力
    use CGIparamJP;             # クエリ入力の日本語コード変換
    use Encode561;              # 汎用の日本語コード変換
    use EscapeSJIS;             # Shift_JIS で絵文字処理を行う
    my $cgi = new CGIparamJP();
    $cgi->set_param_charset( "EUC-JP", "Shift_JIS" );
    my $name = $cgi->param( "name" );

クエリが Shift_JIS コードで入力された場合は、 EscapeSJIS.pm と併用することでクエリ変数中の携帯電話絵文字を &#xHHHH; 形式に、 また Windows の拡張文字(NEC・IBM拡張漢字)を &#xHHHH; 形式に変換します。

EmailHTML.pm モジュール POD

HTMLファイルをMIMEマルチパートに変換します。

    # HTMLメール送信サンプルプログラム
    use strict;
    use EmailHTML;
    use Net::SMTP;

    # 初期設定
    my $SMTP_HOST = "127.0.0.1";
    my $MAIL_FROM = 'from@domain.name';
    my $MAIL_RCPT = 'to@domain.name';
    my $URL = "http://www.domain.name/i/";

    # 指定 URL の内容から HTML をダウンロードする
    my $eh = new EmailHTML( URL => $URL );

    # 標準的なメールヘッダを追加で設定する
    $eh->set_header( From => $MAIL_FROM );
    $eh->set_header( To => $MAIL_RCPT );

    # MIME マルチパート HTML メール形式で取り出す
    my $data = $eh->out_text();

    # Net::SMTP を使ってメール送信する
    my $smtp = new Net::SMTP( $SMTP_HOST ) or die "SMTP Failed - $SMTP_HOST\n";
    $smtp->mail( $MAIL_FROM ) or die "Invalid sender - $MAIL_FROM\n";
    $smtp->to( $MAIL_RCPT ) or die "Invalid receipts - $MAIL_RCPT\n";
    $smtp->data();
    $smtp->datasend( $data );
    $smtp->dataend();
    $smtp->quit();

指定したURLからHTMLをダウンロードし、画像ファイルを含む MIME マルチパート形式による HTML メールに変換します。
ページ内の画像も自動的にダウンロードされ、Base64エンコードされます。 HTML 中に含まれる IMG タグは <IMG SRC="cid:〜"> と書き換えられます。
生成した HTML メールは、 Outlook Express、Becky! 2 で受信・表示できることはもちろん、 NTT DoCoMo 900i シリーズのデコメールとしても受信・表示できます。
ただし、デコメールの制限により、画像ファイルを含めた容量が 10KB 以下となっている必要があります。 10KB を超える場合は、900i 実機で受信した場合に 単なる画像ファイル添付メールとなっているため、ご注意ください。

HTML の文字コードはダウンロードしたまま変更されません。
サーバ上で Shift_JIS のコンテンツは、メール中でも Shift_JIS になります。
ISO-2022-JP、EUC-JP、UTF-8、ISO-8859-1、US-ASCII なども利用可能です。
UCS-2 などの 16bit 文字は利用できません。

なお、EmailHTML.pm 自体は HTML メールデータの生成処理のみを行い、 SMTP プロトコルを利用したメール送信処理は行いません。
メールを送信する場合は、Net::SMTP モジュールを併用するか、 out_file() メソッドで sendmail を起動してメールを送信してください。

EmailJP.pm モジュール POD

Net::SMTP モジュールを併用して、メールを送信します。

    use EmailJP;
    my $count = &EmailJP::sendmail( mail => $text );

$text にメールヘッダ+本文のデータが入っている状態で呼び出すと、 $text 中のメールヘッダを自動的に参照して宛先アドレスを決定し、 メールを送信します。 (もっとも簡単なサンプル)

    use EmailJP;
    my $server;
    $server = "127.0.0.1";                      # SMTPサーバ
    $server = [qw( 192.168.0.1 127.0.0.1 )];    # 複数指定可能
    my $count = &EmailJP::sendmail( 
        server   =>  $server,        # SMTPサーバ
        hello    =>  "localhost",    # HELLO
        timeout  =>  5,              # タイムアウト
        return   =>  $return_path,   # エラー返送先
        to       =>  $rcpt_to,       # メール宛先
        head     =>  $mail_head,     # メールヘッダ
        body     =>  $mail_body,     # メール本文
        charset  =>  "iso-2022-jp",  # 送信文字コードは JIS
        internal =>  "EUC-JP"        # 内部文字コードは EUC
    );

では、メールヘッダとメール本文を別の変数として渡しているだけでなく、 送信宛先アドレスや使用する SMTP サーバ、文字コードなども指定しています。

送信文字コードが ISO-2022-JP の場合は、自動的に EscapeJIS.pm モジュールが呼び出されます(明示的なuse EscapeJIS;は不要)。
メールヘッダ・メール本文中の携帯絵文字や、PC 拡張漢字を安全に送信します。
(ただしiモードの仕様上、iモード絵文字については ISO-2022-JP では iモード携帯実機には送信できません。Shift_JISを使用してください)

送信文字コードが Shift_JIS の場合は、自動的に EscapeSJIS.pm モジュールが呼び出されます(明示的なuse EscapeSJIS;は不要)。
メールヘッダ・メール本文中の携帯絵文字や、PC 拡張漢字を安全に送信します。

メール中に &#xE63E; のような Unicode 16進数コード参照表記があると、 宛先メールアドレスから自動判別を行って送信処理を切替えます。

つまり、1種類のメールテンプレートを作成するだけで、 どのキャリアの携帯でも絵文字の入ったメールを受け取れることができます。

EmojiTrans.pm モジュール POD

DoCoMo 用絵文字を、au・SoftBank 用絵文字に変換します。

本モジュールでは、絵文字は Unicode の &#xHHHH; 形式にした状態で扱います。
絵文字以外の文字については、 ISO-2022-JP、EUC-JP、UTF-8、ISO-8859-1、US-ASCII など 文字コードは問いません(UCS-2 は除く)

EmojiTransMap.txt 変換マップ

変換マップ(定義ファイル)中の絵文字は、 Shift_JIS バイナリコードではなく、 全て Unicode の 16進数で表記しています。 (コメント部分は EUC-JP です)

Encode561.pm モジュール POD

Perl 5.6.1 や 5.005 など Encode.pm を利用できない環境で、 Encode.pm ライクな変換関数を提供します。

    use Encode561;
    my $text = "Hello, World!\n";
    Encode561::from_to( $text, "utf8", "cp932" );
    print $text;

Encode.pm は日本語だけでなく多言語の変換に有用ですが、 Perl 5.8.x 以降でしか利用できません。
しかし、サーバ運用上、どうしても Perl 5.005 や Perl 5.6.x といった 古いバージョンのまま稼動してるマシンも多いと思います。
Jcode.pm や Unicode::Map といったモジュールを組み合わせることで Encode.pm と同等の処理も実現できまうが、 Encode/Jcode/Unicode::Map ではそれぞれインターフェースが異なるため、 プログラムが複雑になってしまいます。
Encode561.pm は、Encode::from_to 関数と同等の処理を行う関数 Encode561::from_to 関数を提供します。 Perl 5.005 および 5.6.x のサーバ上で Encode561.pm を利用して 開発したプログラムを、Perl 5.8.x のサーバで本来の Encode.pm を 利用して稼動させることが可能になります。

Jcode.pm および Unicode::Map では、Unicode から他のコードに変換時に 出力先文字セットで表現できない文字は「??」や「〓」に変換されたり、 削除されてしまいます。
Encode.pm には、それを回避する Encode::FB_XMLCREF オプションがあります。 Jcode.pm および Unicode::Map でも、この FB_XMLCREF 相当の機能を実現するパッチプログラム を予め適用しておくことをお勧めします。
変換不可能な文字を &#xHHHH; の形式にエスケープすることで、文字化けを防ぎます。

Encode561.pmの逆の役割をするモジュールに JEcode.pmがあります。 こちらは、Perl 5.8.xでEncode.pmを利用して Jcode.pm互換のメソッドを提供するラッパーだそうです。

EntityRef.pm モジュール POD

文字列中の実体参照表記をコード参照表記に変換します。

new コンストラクタ

HTML/XML 用の実体参照の定義マップファイルを読み込みます。
new() の第1引数で定義マップファイルを指定します。
引数で定義ファイルを1つも指定しない場合、デフォルトでは
HTMLlat1.ent、HTMLspecial.ent、HTMLsymbol.ent
の3つの標準定義マップファイルを読み込みます。
これらのファイルは EntityRef.pm と同じディレクトリに設置してください。

    use EntityRef;
    my $er = new EntityRef( "EmojiDoCoMo.ent" );

この例では、DoCoMo 用絵文字用の実体参照の定義マップファイルのみを読み込みます。

entity2hex メソッド

new で読み込んだ定義マップを利用して、 文字列中の実体参照表記を、Unicodeコード番号表記(16進数)に変換します。

    use EntityRef;
    my $er = new EntityRef();
    my $text = "EURO € ALPHA Α COPY ©\n";
    $er->entity2hex( \$text );

この例では、$text 中の実体参照表記が コード参照表記に変換されます。
$text の文字コードは、UTF-8/Latin-1/Shift_JIS/EUC-JP など問わず 利用できます。(UCS-2/UTF-16 を除きます)

ただし安全・互換性のため、Unicode 番号が 128 より小さい文字(0〜127)については コード参照表記には変換されず、実体参照のままとなります。 具体的には &lt; &amp; &gt; &quot; などが該当します。

HTMLlat1.ent エンティティ定義

HTML 4.01 Latin-1 entities (&copy; → &#169; → © など)
http://www.w3.org/TR/html401/HTMLlat1.ent

HTMLspecial.ent エンティティ定義

HTML 4.01 Special entities (&lt; → &#60; → <、&gt; → &#62; → > など)
http://www.w3.org/TR/html401/HTMLspecial.ent

HTMLsymbol.ent エンティティ定義

HTML 4.01 Symbol entities (&alpha; → &#945; → α など)
http://www.w3.org/TR/html401/HTMLsymbol.ent

EmojiDoCoMo.ent エンティティ定義

DoCoMo の携帯絵文字それぞれに英字名を定義したものです。
(DoCoMo の正式の絵文字名称ではありません)

EscapeJIS.pm モジュール POD

ISO-2022-JP テキスト中に絵文字・IBM拡張漢字を使えるようにします。

    use EscapeJIS;
    $body = "絵文字入り[]\n";
    Jcode::convert( \$body, "jis", "euc" );
    EscapeJIS::unescape( \$body );
    print $body;

unescape メソッドを呼び出す際には $body内は予め JIS コードにする必要があります。
絵文字コードは &#xHHHH; のUnicode 16進数コード参照形式とします。
主に、このunescapeメソッドを通過した文字列をメール送信して利用します。

なお、DoCoMo 携帯実機では charset=ISO-2022-JP のメールでは絵文字は利用できないので、 EscapeJIS.pm は使っても絵文字は表示できずに文字化けします。 EscapeSJIS.pm を利用して charset=Shift_JIS でメールを送る必要があります。

EscapeSJIS.pm モジュール POD

Shift_JIS テキスト中に絵文字・IBM拡張漢字を使えるようにします。
このモジュールで取り扱う文字コードは、Shift_JIS コードのみとします。
EUC-JP や UTF-8 への変換機能は含みません。

DoCoMo 用絵文字 http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/list/index.html
SoftBank 用絵文字 http://developers.softbankmobile.co.jp/dp/tool_dl/web/picword_top.php
au 用絵文字 http://www.au.kddi.com/ezfactory/tec/spec/3.html

なお、SoftBank 用絵文字については、 SoftBank 社のJava 環境 (S!アプリ作成用コード) では各絵文字が Unicode の E001〜E55A にマップされますが、 本仕様では au 用絵文字との重複マッピングを避けるため、 F001〜F55Aに移動しています。

escape 関数

IBM 拡張漢字・携帯電話絵文字を含む文字列は文字化けの原因となるため、 &#xHHHH; 16進数 Unicode コード参照表記に変換することで、 以後の Shift_JIS のテキスト処理を安全にします。

unescape 関数

&#xHHHH; 16進数 Unicode コード参照表記の IBM拡張漢字・携帯電話絵文字を、Shift_JIS バイナリに変換します。 &#xHHHH; 形式の表記に全ての環境が対応しているわけではないので、 PCや携帯電話実機での表示時の互換性を高めます。

EscapeUTF8.pm モジュール POD

EscapeSJIS.pm と EscapeJIS.pm モジュールと同様に、 escape および unescape 関数を提供します。 実際には、UTF8 環境下ではエスケープ処理は不要のため、escape メソッドは何もしません。 現状では単に同名の関数を提供しているだけです

コメントはこちらへ by AjaxCom

その他のページへのリンク

このページへのトラックバック by AjaxTB

トラックバックURL:http://www.kawa.net/service/tb/ajaxtb.cgi/works/perl/i18n-emoji/i18n-emoji.html

Kawa.netxp © Copyright 2004-2006 Yusuke Kawasaki