【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

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

おすすめ記事

記事・ニュース一覧