日本語を含む多言語処理(主に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 からのモジュールインストールのできない環境でも、利用できます。
各モジュールとこのページの主な更新履歴です。
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; 形式に変換します。
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 を起動してメールを送信してください。
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 拡張漢字を安全に送信します。
メール中に  のような Unicode 16進数コード参照表記があると、 宛先メールアドレスから自動判別を行って送信処理を切替えます。
つまり、1種類のメールテンプレートを作成するだけで、 どのキャリアの携帯でも絵文字の入ったメールを受け取れることができます。
DoCoMo 用絵文字を、au・SoftBank 用絵文字に変換します。
本モジュールでは、絵文字は Unicode の HHHH; 形式にした状態で扱います。
絵文字以外の文字については、
ISO-2022-JP、EUC-JP、UTF-8、ISO-8859-1、US-ASCII など
文字コードは問いません(UCS-2 は除く)
変換マップ(定義ファイル)中の絵文字は、 Shift_JIS バイナリコードではなく、 全て Unicode の 16進数で表記しています。 (コメント部分は EUC-JP です)
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 相当の機能を実現するパッチプログラム
を予め適用しておくことをお勧めします。
変換不可能な文字を HHHH; の形式にエスケープすることで、文字化けを防ぎます。
Encode561.pmの逆の役割をするモジュールに JEcode.pmがあります。 こちらは、Perl 5.8.xでEncode.pmを利用して Jcode.pm互換のメソッドを提供するラッパーだそうです。
文字列中の実体参照表記をコード参照表記に変換します。
HTML/XML 用の実体参照の定義マップファイルを読み込みます。
new() の第1引数で定義マップファイルを指定します。
引数で定義ファイルを1つも指定しない場合、デフォルトでは
HTMLlat1.ent、HTMLspecial.ent、HTMLsymbol.ent
の3つの標準定義マップファイルを読み込みます。
これらのファイルは EntityRef.pm と同じディレクトリに設置してください。
use EntityRef; my $er = new EntityRef( "EmojiDoCoMo.ent" );
この例では、DoCoMo 用絵文字用の実体参照の定義マップファイルのみを読み込みます。
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)については コード参照表記には変換されず、実体参照のままとなります。 具体的には < & > " などが該当します。
HTML 4.01 Latin-1 entities
(© → © → © など)
http://www.w3.org/TR/html401/HTMLlat1.ent
HTML 4.01 Special entities
(< → < → <、> → > → > など)
http://www.w3.org/TR/html401/HTMLspecial.ent
HTML 4.01 Symbol entities
(α → α → α など)
http://www.w3.org/TR/html401/HTMLsymbol.ent
DoCoMo の携帯絵文字それぞれに英字名を定義したものです。
(DoCoMo の正式の絵文字名称ではありません)
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 でメールを送る必要があります。
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に移動しています。
IBM 拡張漢字・携帯電話絵文字を含む文字列は文字化けの原因となるため、
HHHH; 16進数 Unicode コード参照表記に変換することで、
以後の Shift_JIS のテキスト処理を安全にします。
HHHH; 16進数 Unicode コード参照表記の IBM拡張漢字・携帯電話絵文字を、Shift_JIS バイナリに変換します。 HHHH; 形式の表記に全ての環境が対応しているわけではないので、 PCや携帯電話実機での表示時の互換性を高めます。
EscapeSJIS.pm と EscapeJIS.pm モジュールと同様に、 escape および unescape 関数を提供します。 実際には、UTF8 環境下ではエスケープ処理は不要のため、escape メソッドは何もしません。 現状では単に同名の関数を提供しているだけです
トラックバックURL:http://www.kawa.net/service/tb/ajaxtb.cgi/works/perl/i18n-emoji/i18n-emoji.html
Kawa.netxp © Copyright 2004-2006 Yusuke Kawasaki