アンケートご協力のお願いgihyo.jpでは,2010年度に向けて豪華プレゼントが当たる読者属性アンケートを実施しております。ご協力ください。

gihyo.jp » DEVELOPER STAGE » 連載 » 【PHPで作る】初めての携帯サイト構築 » 第3回 携帯サイトの文字コードに気をつける

【PHPで作る】初めての携帯サイト構築

第3回 携帯サイトの文字コードに気をつける

各端末の文字エンコードの対応状況

PCサイトの場合,画面に出力するページの文字エンコードは特に気にすることなく好みによって適当な文字エンコードを使用している場合が多いでしょう。またPHPなどのプログラムを使って画面を表示している場合,プログラムの内部文字エンコードと出力する文字エンコードを基本的に統一していると思います。

携帯サイトにおいてはキャリアや端末に応じて対応している文字エンコードが異なり,PCサイトのように文字エンコードを意識せずそのまま出力すればよいという状況ではありません。各キャリアで対応している文字エンコードは次の通りです。

キャリアなど 対応文字エンコード
docomo HTML Shift_JIS
docomo XHTML Shift_JIS,UTF-8
au Shift_JIS
SoftBank MML Shift_JIS
SoftBank HTML Shift_JIS,EUC-JP,ISO-2022
SoftBank P4(2)型/3GC型 Shift_JIS,EUC-JP,ISO-2022,UTF-8

上記はキャリアが対応を発表している文字エンコードであり,機種によっては公式に発表している文字エンコード以外にも対応している場合もあります。上記の表から,携帯サイトで共通に使える文字エンコードは「Shift_JIS」であることがわかります。このことから携帯サイトでは基本的に「Shift_JIS」を使って画面の入出力を行うことになります。ちなみにSoftBankの3GC型などの端末では,「Shift_JIS,EUC-JP,ISO-2022,UTF-8」のそれぞれに対応していますが,「EUC-JP,ISO-2022」はキャリアのゲートウェイを通過するときに「Shift_JIS」に自動的に変換されてきます。そのため出力はできますが取り扱いはShift_JISとなるため,SoftBankのみの携帯サイトの場合はShift_JISかUTF-8に絞って対応するとよいでしょう。

絵文字を考慮に入れた文字エンコード

携帯サイトの場合,文字エンコードは「Shift_JIS」を利用すればよいことがわかりました。しかしShift_JISを使っていても一部の文字が化けてしまうといった状況が起こり得ます。それは絵文字の問題があるためです。絵文字は各キャリアで統一されておらず,それぞれが独自の体系と種類を持っています。その絵文字は通常の「Shift_JIS」のコード外に設定されており,そのまま「Shift_JIS」を使っていてはプログラムで処理を行ったときに理解できず,文字が壊れてしまったりといったことになってしまいます。

携帯サイトで絵文字を取り扱うには,各キャリアの絵文字が設定されている外字領域を含んだ文字エンコードを使う必要があります。PHPの場合,その文字コードは「SJIS-win」になります。「SJIS-win」は「Shift_JIS」に比べて扱える文字種が増えており,キャリアが表現している絵文字領域を網羅しています。そのためPHPを利用して携帯サイトを作成する場合は文字エンコードを「Shift_JIS」ではなく「SJIS-win」にします。また内部文字エンコードに「EUC-JP」を利用しているサイトの場合,こちらも絵文字領域に対応していないので同様に「eucJP-win」を利用することに気をつけます。なおUTF-8は絵文字領域のコードにも対応しているので,特に意識する必要はありません。

文字エンコードの取り扱いで特に気をつけるべき箇所は「画面への出力」「画面からの入力」です。ここでは画面からの文字入力部分を見てみます。内部文字エンコードがEUCを利用している場合を想定しています。

入力文字の文字エンコード変換

mb_convert_variables(mb_internal_encoding(),   'SJIS-win', $_POST);
mb_convert_variables(mb_internal_encoding(),   'SJIS-win', $_GET);

携帯サイトの文字コードは「SJIS-win」を利用すればよいことがわかりました。ただしこのままでは一部の端末でまだ問題が起こってしまいます。

SoftBankの3GC型では文字エンコードを変更する

携帯サイトを作成する場合,文字エンコードはSJIS-winを利用していれば基本的に問題ないのですが,SoftBankの3GC型の端末では入力したはずの絵文字がプログラムの部分でごっそりと消えてしまうという現象が起こったりします。この現象を回避するためには,UTF-8を使って画面の入出力を行う必要があります。UTF-8を使った場合,絵文字が正しく送られてきます。そのため通常の携帯端末への画面出力は「SJIS-win」を用い,SoftBankの3GC型の端末のみ「UTF-8」で出力するということになります。

SoftBankの3GC型を考慮に入れた文字入力の文字エンコード変換

<?php

// Net_UserAgent_Mobile
require_once('Net/UserAgent/Mobile.php');

// Net_UserAgent_Mobileをインスタンス化する
$agent = Net_UserAgent_Mobile::singleton();

// 入力文字エンコードを変換する
if ($agent->isSoftBank() && $agent-> isType3GC()) {
    mb_convert_variables(mb_internal_encoding(), 'UTF-8', $_POST);
    mb_convert_variables(mb_internal_encoding(), 'UTF-8', $_GET);
} else {
    mb_convert_variables(mb_internal_encoding(), 'SJIS-win', $_POST);
    mb_convert_variables(mb_internal_encoding(), 'SJIS-win', $_GET);
}

?>

php.iniを設定する

次に文字コードを考慮に入れたPHPの設定ファイル(php.ini)の設定項目を見ていきましょう。PHPの設定ファイルはサーバーのすべてのプログラムに影響があるので注意が必要です。今回の文字エンコードに関わる部分はmbstring周りの設定を見直すのですが,同一のサーバーでPC用のサイトを公開している場合などは,設定を不用意に変えると文字化けを起こしてしまいます。そのため設定ファイル(php.ini)ではPCサイトと携帯サイトどちらでも共に使えるような設定にしておきます。

php.iniの設定

mbstring.encoding_translation = Off
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.internal_encoding = eucJP-win

「mbstring.encoding_translation」は画面からの入力文字のエンコードを内部文字エンコードに自動変換してくれる機能の設定です。PCや携帯の機種によって文字コードを動的に変化させる必要があることなどから,ここでは自動変換をOffにしておきます。「mbstring.http_input」は画面からの入力文字エンコードのデフォルト値になります。「mbstring.http_output」は出力側の設定です。これも文字エンコードを設定せず,そのまま変換しない「pass」を設定しておきます。「mbstring.internal_encoding」は内部文字エンコードを設定します。ここではEUCを利用しているので「eucJP-win」を設定しています。

またプログラムの文字エンコード変換で文字エンコードを直接指定せず,「auto」の設定を使っている場合は注意が必要です。autoは自動で文字エンコードを判別してくれる便利な設定ですが,指定の文字エンコードがどれに該当するかを順番に調べていっているに過ぎません。デフォルトでは「ASCII, JIS, UTF-8, EUC-JP, SJIS」の順番で調べていき,文字エンコードを判別しています。しかしこのままではEUC-JPやSJISに該当する文字エンコードは,SJIS-winやeucJP-winが利用されないといった状況になってしまいます。そのためautoを使う場合は次のように「mbstring.detect_order」を設定しておく必要があります。

mbstring.detect_orderの設定

mbstring.detect_order =   SJIS-win,eucJP-win,JIS,UTF-8,ASCII

今回は携帯サイトの文字エンコードを見てきました。次回は携帯の絵文字の取り扱いについて見ていきたいと思います。

著者プロフィール

荒木稔(あらきみのる)

京都出身。ホテルマンを経て,基幹システムの開発などに従事した後ウェブクリエイターとして独立。利用者にもっと近いサービスを提供したい想いから,携帯を中心とした企画/開発/執筆/講演活動を行う。近著に「PHP×携帯サイト デベロッパーズバイブル」(ソフトバンククリエイティブ)。家族のための携帯サイト「ファミリーモバイル」(http://www.fmob.jp)を立ち上げ現在に至る。

memokamihttp://memokami.com

コメント

コメントの記入

パスサポ

多数の情報処理技術者試験対策書籍の発行実績を誇る技術評論社がお届けする,資格試験合格サイト「めざせ! 情報処理試験 パスサポ」が開設されました。

ピックアップ

サクセスストーリーに続く,快適サーバー運用管理のヒント!

データの増大,煩雑な管理,システムダウン,セキュリティなど,迫りくる課題からシステム管理者の負担を軽くするポイントを解説します。

gihyo.jp インフラエンジニア情報局

ネットワークやITにかかわるあらゆる業種で必要とされるインフラエンジニアに向けた技術情報や心構え,その魅力について多角的に紹介。

テストエンジニア ステーション

いま,ITに関わるあらゆる開発業務で注目されつつあるテスト系エンジニアをターゲットにしたコンテンツサイトを展開します。

一行クイックアンケート

gihyo.jpで取り上げてほしいネタは?

※検索はページ右上の検索ボックスをご利用ください。

その他の連載

読むウェブ ~本とインタラクション

ディスプレイで読む活字とそのインタラクション(interaction:相互作用)について,最新Webを紹介しながら読み解いていく。

いま,見ておきたいウェブサイト

この連載では,国内外の最新のウェブサイトを隔週更新で取り上げ,これら最新サイトの特徴や素晴らしい部分を,さまざまな角度から解説していきます。

Windows phoneアプリケーション開発入門

Windows Marcketplace for Mobileがサービス開始され,作成したアプリケーションを個人でも世界をターゲットに公開できる環境が整ってきました。これを機にWindows phoneアプリケーションの開発をしてみませんか?

ここは知っておくべき!Windows Server 2008技術TIPS

5年ぶりのサーバOSとなったWindows Server 2008が出荷されて早2年。2009年にはR2が出荷され,再び注目を集めています。発売前から実施したトレーニングによって感じた,インフラエンジニアの方々に知っておいていただきたい機能を中心にご紹介します。

キーパーソンが見るWeb業界

本連載はWeb Site Expert/gihyo.jpとの連動企画です。阿部淳也, 長谷川敦士, 森田雄のお三方による,Web業界をテーマにした座談会です。

きたみりゅうじの聞かせて珍プレー

ソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。みなさんからの投稿もお待ちしてます!

ActionScript 3.0で始めるオブジェクト指向スクリプティング

野中文雄氏が,簡単なスクリプトは書いたことがあるという初級者を対象に,ActionScript 3.0の基本からクラス定義までを解説します。

まだ間に合う「ITパスポート」受験対策 原山先生の短期合格塾

この連載では,4月18日のITパスポート試験の受験に向けて,短い期間で効率良く受験対策を行う方法や,確実に得点するための裏ワザなどを伝授していきます。

連載一覧

gihyo.jp

  • DEVELOPER STAGE
  • ADMINISTRATOR STAGE
  • WEB+DESIGN STAGE
  • LIFESTYLE STAGE
  • SCIENCE STAGE
  • NEWS & REPORT

書籍案内

  • 新刊書籍
  • 書籍ジャンル一覧
  • 書籍シリーズ一覧
  • 新刊ピックアップ
  • ロングセラー
  • 電脳会議

定期刊行物一覧

  • Software Design
  • WEB+DB PRESS
  • Web Site Expert
  • 組込みプレス