Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Perlで作るモバイルサイトのコツ:第4回

絵文字・機種依存文字を考慮した文字コードの相互変換

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/11/08 00:00

本連載では、Perlによる携帯サイトを構築する上で役立つ、さまざまなTipsを解説していきます。第4回は、携帯サイトを構築する上で避けては通れない「文字コード」について解説します。また、絵文字や全角/半角カタカナの扱いについても触れます。

はじめに

 携帯用のサイトを作成する際に避けて通れないのが文字コードです。入出力と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プログラムを用いて紹介します。

sample01.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つです。ここをしっかりと実装することで安定したサービスが提供できるようになります。これを機会にしっかり理解してみてください。



  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 栗原 由樹(クリハラ ヨシキ)

    株式会社ライブドアが現在の社名になる前の旧オン・ザ・エッヂ時代に同社の技術力に憧れ入社。そこでオープンソースを用いた数多くのWebアプリケーション開発を経験。現在は、メディア事業部 モバイルメディア部にてモバイルサイトを中心に開発を行う傍ら、オープンソースへの貢献について考える日々を送っている。...

バックナンバー

連載:Perlで作るモバイルサイトのコツ

もっと読む

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5