目次

PHP :: 設定 / 文字コード(エンコーディング)設定

携帯(ケータイ)3キャリアに対応した設定

携帯用の設定は大体いつもこんな感じです。

PHPでリクエストを受ける時


DoCoMo(ドコモ) と au(KDDI) からは SJIS-win で受け、SoftBank(ソフトバンク) からは UTF-8 で受ける。
SJIS-win というのは携帯(ケータイ)の絵文字に対応するためで、これにしておくと絵文字が扱いやすい。
また、SoftBank(ソフトバンク) の絵文字を扱う時は UTF-8 の方が扱いやすい。


PHPでレスポンスを返す時


DoCoMo(ドコモ) と au(KDDI) には SJIS-win で返し、SoftBank(ソフトバンク) には UTF-8 で返す。
実現するには、スクリプトやフレームワーク内でユーザエージェントを判別して、出し分けするロジックを自前で書く必要がある。


PHP内部


余談だが、DBを使う場合は特別な理由が無い限りDBのエンコーディング設定も「UTF-8」にする。




▼ 以上を踏まえると以下の設定になる

[php.ini] output_handler = mb_output_handler
[.htaccess] php_value output_handler mb_output_handler


[php.ini] default_charset = “Shift_JIS”
[.htaccess] php_value default_charset Shift_JIS


[php.ini] mbstring.language = Japanese
[.htaccess] php_value mbstring.language Japanese


[php.ini] mbstring.encoding_translation = On
[.htaccess] php_flag mbstring.encoding_translation On


[php.ini] mbstring.internal_encoding = UTF-8
[.htaccess] php_value mbstring.internal_encoding UTF-8


[php.ini] mbstring.http_input = UTF-8,SJIS-win,eucJP-win
[.htaccess] php_value mbstring.http_input UTF-8,SJIS-win,eucJP-win


[php.ini] mbstring.http_output = SJIS-win
[.htaccess] php_value mbstring.http_output SJIS-win


[php.ini] mbstring.detect_order = SJIS-win,eucJP-win,UTF-8
[.htaccess] php_value mbstring.detect_order SJIS-win,eucJP-win,UTF-8




上記の設定を適用した場合、ユーザとサーバ間でどのような挙動になるか図で示します

図では全角カタカナの「アイウエオ」をユーザが送信し、サーバ(PHP)側で半角カタカナの「アイウエオ」に変換した結果を返すという一連の動きを説明しています。
なお、オレンジの①から⑤がDoCoMoとauで、ブルーの①から⑤がSoftBankの動きになります。

文字コード(エンコーディング)設定 - 携帯(ケータイ)3キャリアに対応した設定 -

DoCoMoとau(オレンジの①から⑤)
  1. SJIS-win で全角カタカナ「アイウエオ」を送信
  2. mbstring.encoding_translation = On なので入力文字列を内部コード(UTF-8)に自動変換する
  3. mb_convert_kana 関数を利用して全角→半角の変換を行う
  4. output_handler = mb_output_handler なので出力文字コードの自動変換を行う
    • 出力文字コードは mbstring.http_output = SJIS-win なので SJIS-win
  5. default_charset = “Shift_JIS“ なので Shift_JIS の HTTPヘッダと共に、半角カタカナ「アイウエオ」を受け取る


SoftBank(ブルーの①から⑤)
  1. UTF-8 で全角カタカナ「アイウエオ」を送信
  2. UTF-8 でリクエストされるので、文字コード変換はしない
  3. mb_convert_kana 関数を利用して全角→半角の変換を行う
  4. スクリプト または フレームワークで mb_http_output('pass') をコールして、mbstring.http_output の設定をオーバーロードする
    • pass を指定することで、出力文字コードは内部コードである UTF-8 になる
    • 同時に header() 関数で Content-Type: text/html; charset=UTF-8 を送出する
  5. UTF-8 の HTTPヘッダと共に、半角カタカナ「アイウエオ」を受け取る


関連エントリー: