はじめに
携帯用のサイトを作成する際に避けて通れないのが文字コードです。入出力とWebアプリケーション内部での文字コードを統一すべきか、絵文字はどう扱えばよいのか。文字コード1つ取ってもさまざまな問題があります。
今回はこれらの問題に対して、筆者がいつも行なっている方法を紹介したいと思います。
対象読者
PerlでCGIアプリケーションを作成したことがあり、携帯用のサイトを作成したい方。
必要な環境
Perl 5.8以上が動作する環境。
文字コード変換
最近のWebアプリケーションの開発では、多言語対応という観点から「UTF-8」という文字コードを使用した開発が主流となってきています。PC用サイトのみの開発であれば、すべての処理においてUTF-8を使用するため、特別な文字コード変換処理を実装する必要はありません。
しかし日本国内の携帯電話は、主に「Shift_JIS」で記述されたページの閲覧を想定して作られているため、携帯用サイトの構築を行う場合にはWebアプリケーション内部ではUTF-8を使用し、出力の際にはShift_JISを使用できるようにUTF-8とShift_JISを相互変換する処理を実装する必要があります。
そこで、ここではUTF-8とShift_JISを相互に変換する方法を、簡単なCGIプログラムを用いて紹介します。
#!/usr/local/bin/perl use strict; use CGI; use Encode; use Encode::JP::Mobile; my $q = CGI->new; # 入力された値をShift_JISからutf-8へ変換 for my $p ($q->param) { my @v = map { sjis_to_utf8($_) } $q->param($p); $q->param($p => @v); } # ~ここでさまざまな処理~ # 出力内容を生成(プログラム上では日本語はutf-8で記述) my $output_html = sprintf(<<"HTML", $q->param('foo'), $q->param('bar')); <html> <body> 入力フォーム<br> <form action="sample01.cgi" method="post"> 入力1: <input type="text" name="foo"><br> 入力2: <input type="text" name="bar"><br> <input type="submit" value="送信"> </form> 入力された内容<br> 入力1: %s<br> 入力2: %s<br> </body> </html> HTML # ヘッダーを出力 print $q->header(-content_type => "text/html; charset=Shift_JIS"); # utf-8からShift_JISへ変換して出力 print utf8_to_sjis($output_html); # Shift_JIS→utf-8 sub sjis_to_utf8 { my $str = shift; return encode('utf-8', decode('shift_jis-imode', $str)); } # utf-8→Shift_JIS sub utf8_to_sjis { my $str = shift; return encode('shift_jis-imode', decode('utf-8', $str)); }
このプログラムで重要な部分は、最後の方に記述されたsjis_to_utf8()
とutf8_to_sjis()
の2つの関数です。関数名からも分かるように、sjis_to_utf8()
は引数で与えられたShift_JISの文字列をUTF-8へ、utf8_to_sjis()
はその逆の処理を行ってます。
しかしよく変換部分をみると、文字コードが「shiftjis」ではなく「shift_jis-imode」となっています。この文字コードは、Encode::JP::Mobileというモジュールで定義されているもので、DoCoMoに特化した絵文字変換を行うと同時にShift_JISの拡張である「cp932」という文字コードにも対応しているため、絵文字や機種依存文字の入った文字列であっても問題なく文字コードを相互に変換できるようになります。
ちなみにDoCoMo用のshift_jis-imode以外に、EZweb用のサイトの場合には「shift_jis-kddi」を、SoftBank用のサイトの場合には「shift_jis-vodafone」を使うことで同様の処理をすることが可能となります。
ただし、このEncode::JP::Mobileの文字コードは今のところ実験段階のモジュールであるため、プロダクション環境での使用には注意が必要です。また代わりに絵文字は扱えませんが「cp932」という文字コードもありますので、そちらを選択するという方法もあります。
全角カタカナを半角カタカナに一括変換するには
最近の携帯用サイトでは全角カタカナを半角カタカナに変換して出力するという処理がスタンダートとなっています。そこでその処理を行なえるように先程のプログラムを少し変更してみます。
変更する部分は、出力時の変換で使用しているutf8_to_sjis()
です。これを下記のように変更することで、全角カタカナをすべて半角カタカナにすることが可能となります(Encode::EUCJPMSとEncode::JP::H2Zをuseし忘れないように注意しましょう)。
use Encode::EUCJPMS; use Encode::JP::H2Z; sub utf8_to_sjis { my $str = shift; my $euc = encode('euc-jp-ms', decode('utf-8', $str)); Encode::JP::H2Z::z2h(\$euc); return encode('shift_jis-imode', decode('euc-jp-ms', $euc)); }
最後に
さて、今回は文字コードの変換方法ついて簡単に紹介しましたが、いかがだったでしょうか。
文字コードはサイトを構築する上で重要な要素の1つです。ここをしっかりと実装することで安定したサービスが提供できるようになります。これを機会にしっかり理解してみてください。