第7回 フォームで絵文字の投稿も受け付けたい - モバイル開発講座 入門・実践編

PHPセキュリティ

まる先生のモバイル開発講座 入門・実践編

Lecutures on PHP

第7回 フォームで絵文字の投稿も受け付けたい (その1)

 このエントリーをはてなブックマークに追加
maru

今回から実践編として、静的なページだけでなく、動的なアプリを作成する上で必要になることがらを取り上げていきます。

今回は、絵文字の投稿を受け付けるにはどのようにすればいいのかを取り上げます。
絵文字の表示については、第4回でとりあげましたので、そちらも合わせて参照してください。
http://www.phppro.jp/school/mobile/vol4/1

今回のテーマはこちらになります。

  1. 文字コードについて
  2. サーバの設定について
  3. 受け取った絵文字について
  4. キャリア間の変換について
  5. サンプルプログラム

1. 文字コードについて

maru

まず意識しなければいけないのが、文字コードです。
フォームから送られてきた絵文字は、バイナリ形式でサーバに送られてきます。
送られてきた文字列を他の文字コードに変換した場合、変換に失敗して絵文字が抜け落ちたり、他の文字になってしまうことがあります。

プログラムのソースファイルの文字コードがUTF-8で、表示してるページを、docomo,auはShiftJIS、SoftBankをUTF-8で表示している場合、表示をするときにも文字コードの変換が必要ですが、取得するときにも文字コードの変換をする必要があります。

ユーザから送られてくる文字コード

  • docomo ShiftJIS
  • au ShiftJIS
  • SoftBank UTF-8

通常は、表示をしているhtmlの文字コードと同じ文字コードでフォームの内容がポストされてきますが、auのみUTF-8でページを表示したとしても、ShiftJISで送られてくるので注意が必要です。

2. サーバの設定について

phpの入力の文字コードの自動判別をしている場合、マルチバイト文字列を扱うphp.iniの設定で以下の項目を使うことになります。

maru
mbstring.http_input
mbstring.encoding_translation

http_inputの設定に「auto」と指定しておくと、自動でソースの内部エンコーディングに変更してくれますが、絵文字を受け取るとなると、この自動変換の仕組みは使えません。

そこで、自動変換をOffにし、自前で変換処理をする必要があります。
php.iniまたは、Apacheであれば .htaccess等で設定の変更ができます。

設定例(.htaccessの場合)

php_value mbstring.http_input pass
php_flag mbstring.encoding_translation Off

phpのマニュアルの「HTTP入出力」の項目も参考にしてください。

http://jp.php.net/manual/ja/mbstring.http.php

maru

3. 受け取った絵文字について

フォームから受け取った文字列の絵文字を保持するようにします。
受け取った絵文字の文字コードを、phpの内部で扱う文字コードに統一します。
絵文字データは、バイナリ形式で文字列に含まれている状態になります。
HTML_Emojiの機能を使用します。

HTML_Emojiのフィルタ機能の「Input」を使用します。
Inputフィルタを使用することで、UTF-8はそのまま、ShiftJISは絵文字の情報を保ったままUTF-8に変換することができます。

$text = $emoji->filter($text, 'Input');

4. キャリア間の変換について

絵文字のデータはそのまま表示を行うことで、出力時にHTML_Emojiを通して各キャリアへの変換処理を行えます。
HTML_Emojiが用意している変換ルールを使用するのであれば、キャリア間の変換を特別意識する必要はありません。

  • 1
  • 2


Pick Up Q&A

Q
3次元配列に格納した値がちゃんと表示されない
 このエントリーをはてなブックマークに追加 
A
>>CODE $_SESSION["item"][$item_id_]["amount"]=$amount; <<CODE 変数「$item_id_」(「$item_id」ではない)には、何をセットされていますか? Notice: Undefined variab...

>>続きを読む

変数名のtypoなど簡単なミスでも自分で気が付かないことはよくあります。どうしても解決できないときは、このように他の人に見てもらったり、コーヒーでも飲んでリフレッシュしてから再度トライしてみてください。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)