̃Gg[͂ĂȃubN}[Nɒlj

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



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

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

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

  • SJIS-win と UTF-8


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


PHPでレスポンスを返す時

  • SJIS-win と UTF-8


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


PHP内部

  • UTF-8


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




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

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

  • 出力の変換を有効にするために mb_output_handler を設定


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

  • HTTPヘッダ charset を Shift_JIS に設定
  • 対SoftBank(ソフトバンク)へは自前で「UTF-8」を吐く


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

  • mb_send_mail() 関数を使わなければ設定の必要は無いけど、とりあえず設定しておく
  • なお、「mbstring.internal_encoding」を指定する時はこれ以降に書かなければならない


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

  • HTTP入力文字コード検出および内部文字コードへの変換を有効にする
  • Formなどから渡された文字が内部コードに変換される


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

  • PHP 内部文字エンコーディング
  • このエンコーディング は、HTTP入力文字エンコーディング変換、HTTP出力文字エンコーディング変換および mbstring モジュールに より定義された文字列関数においてデフォルトの文字エンコーディングとして使用されます
  • スクリプトの文字コードはこれに合わせた方がよい


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

  • ブラウザから送られてくる文字が何の文字コードか判定するための順番
  • 最初にマッチした文字コードを採用する(一番最初は「utf8」が無難)


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

  • ブラウザに送出する文字コードを「SJIS-win」に設定
  • 対SoftBank(ソフトバンク)へは自前で「mb_http_output('pass')」を設定する


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

  • PHP の文字列中の文字コードを判定するための順番
  • 出力文字コードを先頭にもってくるのが良いらしい




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

図では全角カタカナの「アイウエオ」をユーザが送信し、サーバ(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ヘッダと共に、半角カタカナ「アイウエオ」を受け取る





programming/php/settings/mobile_encoding.txt