携帯サイトの絵文字変換に関する質問

このQ&Aのポイント
  • 携帯のサイトで各種携帯電話から絵文字を入力する画面を作成しましたが、絵文字の表示に問題が発生しました。
  • 絵文字をデータベースに格納しているのですが、携帯ごとに絵文字が異なる形式で表示され、変換が上手く行われません。
  • 絵文字を数値に変換するプログラムを作成しましたが、絵文字が正しく変換されずに表示されます。これは携帯ごとの絵文字の形式の違いが原因なのでしょうか?
回答を見る
  • ベストアンサー

文字列変換について

質問させてください。 携帯のサイトで各種(Vodafone, au)携帯電話からBBSに感想を入力する画面を作成しました。 入力される文字列は文字、数字、絵文字があります。 入力されたデータはPostgreSQLのDBに格納しています。 その格納された文字列(絵文字含む)を各種携帯で 表示してみたところ、お互いの絵文字が問題に なったため、変換処理を追加しました。 ======================================== $msg = "********";(DBから取得した文字列(絵文字含む)) $emoji = file(emoji_file.txt); for($r=0;$r<count($emoji);$r++){ $string = chop($emoji[$r]); $emoji_data = split("===", $string); if(strstr($msg, $emoji_data[0])){ echo("HIT"); $msg = eregi_replace($emoji_data[0], $emoji_data[1], $msg); } } echo($msg); ====================================== emoji_file.txt $Fr===1 $G-===281 $G.===287 ====================================== 上記のプログラムで、 DBから取得した文字列内にemoji_file.txt にある絵文字データがあれば数値に変換したいと 考えていますが、"HIT"が表示されるにも かかわらず変換されずに表示されます。 これは、"$G."などVodafoneの絵文字が 普通の文字列と違うからでしょうか? 宜しくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • duckling
  • ベストアンサー率47% (88/185)
回答No.1

Vodafone の絵文字は、1文字5バイトになるのですが、 $Fr ←これは1文字だけ表示させた場合で、 複数行になると実際には、 $Fr$G-$G.$Fr という具合になります。 開始文字と終了文字が省略される、というわけですね。 replaceする時はこの辺を考慮した方がいいです。 さておき、 strstr でHitしたものをうまく置換できないのであれば 置換の際に、eregi_replaceを使っているので eregi で検索してはどうでしょうか? if(eregi($emoji_data[0],$msg)){ $msg = eregi_replace($emoji_data[0],$emoji_data[1],$msg); echo "HIT"; } これで HIT と出るのにそれでも置換されないのであれば また悩んでみては?

関連するQ&A

  • 携帯サイトでの絵文字対応BBSの作成で絵文字の変換に困っています。

    PHPとMySQLを使って絵文字対応の携帯サイト用BBSを構築しています。データベースに登録した絵文字付のコメントを取得すると、絵文字部分がうまく表示されずに困っています。 現在、携帯サイト用の絵文字対応BBSを作成しています。フォームから絵文字付のコメントを入力して、それをDBに登録、または登録されている絵文字付コメントをDBから取得するというものです。 DBに登録する際に入力した絵文字を「<emoji=1,,,>」のような形に変換してeucJP-winでDBに登録します。 出力する際には「<emoji=1,,>」を対応する絵文字に変換(事前に変換表を作成しました。)して画面に出力します。 その際、直接ソースに記述した<emoji=1,,>は対応する絵文字に変換されて表示されるのですが、DBから取得した絵文字付コメント(例:こんにちは<emoji=1,,>)は対応する絵文字に変換されない状態になっており困っています。 ob_start();                     :                     : <?php $mysql=new MySQL; $sql="SELECT no,title,imp FROM s001osirase ORDER BY no DESC LIMIT 0,3"; $mysql->query($sql); while($row=$mysql->fetch()){ $no=$row['no']; $title=$row['title']; $title=mb_convert_encoding($title,'SJIS-win',mb_internal_encoding()); $imp=$row['imp']; if($imp=="yimp"){ echo '<div style="color:#FF0000;font-size:xx-small;">[重要</div>'; echo '<div style="font-size:xx-small;"><a href="/mobile/s001/bbs/bbs_show.php?no='.$no.'">'.$title.'</a></div>'; }else{ echo '<div style="color:#FF0000;font-size:xx-small;">[普通]</div>'; echo '<div style="font-size:xx-small;"><a href="/mobile/s001/bbs/bbs_show.php?no='.$no.'">'.$title.'</a></div>'; } } ?>                 : //内部文字コード(eucJP-win)をSJIS-winに変換する関数 outpue_encode(); //<emoji=1,,,>部分を絵文字に変換してバッファを出力する関数 emoji_output(); emoji_output関数は以下のとおりです。 function emoji_output(){ $output_str=ob_get_contents(); ob_end_clean(); header('Content-Type: application/xhtml+xml;'); $output_str=preg_replace_callback('/<emoji=([0-9,]+)>/','emoji_output_changea',$output_str); echo $output_str; } コールバック関数emoji_output_changeaで$output_str内の<emoji=1,,,>を絵文字に変換しています。 ob_start()を使ってバッファにためて、emoji_outputで<emoji=1,,>を一括でpreg_replace_call関数を使って絵文字に変換して出力しています。この関数は問題なく動いていると思います。 DBから取得した記事が格納された変数$titleのみ変換されていないように思います。 考えられる原因がお分かりの方、いらっしゃいましたらよろしくお願いします。 わかりづらい文章で申し訳ありません。

    • ベストアンサー
    • PHP
  • 携帯絵文字変換スクリプトで20個目以降がエラーに

    ただいま1つのソースで3キャリアに対応した携帯サイトを作成しております。 絵文字を表示させるために、HTMLタグボードさんで配布されている「携帯絵文字変換スクリプト 3キャリア対応」 http://www.dspt.net/tools/emoji/ (フリーソフト/改変・改造自由)を組み込んでみたのですが、 下のようなエラーになってしまいました。 絵文字が19個目までは正常に表示されて、20個目以降がエラーになってしまいます。 (テストの為にHTMLファイルの<BODY></BODY>内に同じ絵文字だけを20個以上並べたところ、絵文字の種類にかかわらず20個目から[an error occurred while processing this directive]となってしまいます。) HTMLファイルをPCから開いても携帯から開いても上記と同じ現象が起こるので、もしかしたら携帯絵文字変換スクリプトの中に表示数の上限に関係した記述があるのではと思ったのですが、php初心者のためスクリプトを見ても原因がわかりませんでした。 もし原因の分かる方がいらっしゃったら、ぜひ教えていただければと思います。 どうぞよろしくお願いいたします。 ■絵文字変換スクリプト本体 trans.php <?php //┌───────────────────────────────── //│ [ EMOJI TRANS Ver2.3] //│ trans.php - 2008/06/15 //│ Copyright (C) DSPT.NET //│ webmaster@dspt.net //│ http://www.dspt.net/ //└───────────────────────────────── /********************** 初期設定 ***********************/ //絵文字変換表 $emoji_data = "emojix.csv"; //入力値取得 $num = $_GET["emoji"]; //PC用絵文字格納フォルダ $img_dir = "/php/emoji/images/"; //ドコモ→au絵文字自動変換利用(on:1 off:0) $ie = "1"; /********************** 以下からは改変しないほうが無難 ***********************/ //変換表を配列に格納 $emoji_array = array(); $emoji_array[] = ""; $contents = @file($emoji_data); foreach($contents as $line){ $line = rtrim( $line ); $emoji_array[] = explode(",", $line); } function encode($data) { $data = mb_convert_encoding($data, "SJIS", "auto"); return $data; } //携帯UA取得 $agent = $_SERVER["HTTP_USER_AGENT"]; //携帯端末のユーザエージェントを判定 function mobile($data){ if(preg_match("/^DoCoMo\/[12]\.0/i", $data)) { return "i";// i-mode } elseif(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]980|SoftBank)\//i", $data)) { return "s";// softbank } elseif(preg_match("/^KDDI\-/i", $data) || preg_match("/UP\.Browser/i", $data)) { return "e";// ezweb } elseif(preg_match("/^PDXGW/i", $data) || preg_match("/(DDIPOCKET|WILLCOM);/i", $data)) { return "w";// willcom } elseif(preg_match("/^L\-mode/i", $data)) { return "l";// l-mode } else { return "p";// pc } } //携帯キャリアに合わせて絵文字を出力 function emoji($data) { global $agent,$emoji_array,$img_dir,$ie; if(preg_match("/[0-9]{1,3}/", $data) && is_numeric($data) && 0 < $data && $data < 253) { switch(mobile($agent)){ case "i"; $put = $emoji_array[$data][1]; break; case "e"; if (preg_match("/[^0-9]/", $emoji_array[$data][2])) { $put = $emoji_array[$data][2]; } elseif ($ie > 0) { $put = $emoji_array[$data][1]; // Display such the icons that ezserver transformed as docomo i-emoji. } else { $put = "<img localsrc=\"".$emoji_array[$data][2]."\" />"; } break; case "s"; if (preg_match("/^[A-Z]{1}?/", $emoji_array[$data][3])) { $put = "\x1B\$".encode($emoji_array[$data][3])."\x0F"; } else { $put = encode($emoji_array[$data][3]); } break; case "p"; $put = "<img src=\"".$img_dir.$emoji_array[$data][0].".gif\" width=\"12\" height=\"12\" border=\"0\" alt=\"\" />"; break; } echo $put; } else { echo "[Error!]\n"; } } //処理 emoji($num); ?>

    • ベストアンサー
    • PHP
  • アスタリスクを文字列として変数に入れるには

    HP-UX cshで、アスタリスクを文字列として 変数に入れるにはどうしたら良いでしょうか? 現在は <file3の中身> grep -v file*.txt | grep -v file2.txt で、 set hensu=`cat file3.txt`としてecho $hensuすると grep -v file1.txt file2.txt file3.txt | grep -v file2.txt という具合に、アスタリスクがワイルドカードとして 働きます。これを「file*.txt」という文字列として 変数に入れる方法を教えてください。 宜しくお願いします。

  • アクセスで文字列の特定の文字の置換について…

    アクセスで文字列の特定の文字の置換について… ------------------- m(__)m ------------------- 「Qメッセージ」を基に「Fメッセージ」があります。 Qメッセージに「ID, Msg_Taitoru, Msg_Txt, 顧客名, 郵便番号, 住所, 発送方法」などの各フィールドがあります。 FメッセージにはQメッセージの「DateTxt」の他に「非連 結のTxt_Msg」があり、その「Txt_Msg」にフォームの 開く時イベントで「QメッセージのMsg_Txt」のデータの文 字列を代入しています。 代入した文字列の特定の文字を「Qメッセージ」の各データ から置換えたいです。 文字列の特定の文字が[顧客名]・[郵便番号]・[住所]・[発 送方法など]です。 他のサイトを参考に自分なりにやって視たのですが…・ ------------------- m(__)m ------------------- Private Sub cmd_Msg_Click() Dim msg_bun As String msg.bun = Me.txt_Msg msg.bun = Replace(msg_bun, "[顧客名]", tName) tName = RTrim(DLookup([Txt_顧客名]).Value) msg = body.SendMail(msg_bun, "") End Sub コンパイルエラー: 引数は省略できません と出ます。 ---------------------------------------------- いつもお世話になるばかりですいません<m(__)m> ご教授よろしくお願い致します。

  • EXCELの日付データを文字列に変換したい

    EXCELの和暦形式の日付データを文字列に変換する方法を教えてください。 たとえば、H17.9.2をそのまま文字列に変換したいのです。 最初から文字列データとして入力すれば問題ないのですが、日付データ(標準)として入力されたデータを書式→セル→文字列で変換するとシリアル値に変わってしまいます。(H17.9.2→38597) どうしたらよいのでしょうか。お願いします。

  • 文字列から数字への変換

    文字列から数字への変換にはatoiなどを使うと思うのですが これだと文字として0を変換すると アルファベットなどを変換した場合と 同じになってしまいますよね? 0も入力を受け付けてなおかつ文字列は受け付けないように するにはどのようにすればよいのでしょうか? アドバイス・回答よろしくお願いします

  • 携帯からの絵文字をWebで再現するには?

    HTML_Emojiでいい感じになるかと思ったんですが、フォームからの入力ではなく、携帯端末から受け取った絵文字メールをサーバーで解析してWeb画面に出力したいです。 受け取ったメール本文を ISO-2022-JP から UTF-8 に変換してDBに格納してSELECTして、HTML_Emoji咬ませて画面出力したいのですが、DB格納時点で「?」に文字化けしています。 何かしら回避策はあるのでしょうか? 無理なら「無理」と答えが欲しいです。

    • 締切済み
    • PHP
  • ドコモの絵文字だけが・・カラーで表示しない

    どうしてもドコモだけが、絵文字を呼び出した時に、黒色で表示され、本来のドコモの色付の絵文字になりません。 なお、構築方法は SSIをHTMLで表示させてHTMLファイルはSJISでコーディングしています。絵文字の呼び出しには <!--#include virtual="/php/trans.php?emoji=絵文字番号"--> バイナリデータをPHPで扱う場合には特殊な処理はしないとダメでしょうか。アドバイス願います。 サンプルコードは http://www.dspt.net/data/emoji/sample.txt ダータファイル http://www.dspt.net/data/emoji/emoji.csv

    • 締切済み
    • PHP
  • 携帯絵文字の掲示板について

    いつも感謝してますが、また質問してしまいました。 本当に情けないです。。。。 現在携帯サイトを構築しています。 PHP×携帯デベロッパーズバイブルって本の掲示板の一部分なんですが、以下の箇所(具体的には正規表現の箇所)でエラーがでます。 またこの掲示板のスクリプトなんですが、この本自体のサンプルコードはどこかに落ちてないのでしょうか? できれば、それが一番早いんですが。。。。 /* * 絵文字の入った入力文字列を内部絵文字の入った文字列に変換する(SoftBankの3GC) * * @param integer $data 入力された文字列 * @return string 内部絵文字に変換された文字列 */ function emoji_text_input_softbank_utf8($data){ //入力文字が空の場合 if(empty($data)){ return $data; } $old_data=$data; $new_data=''; while(1){ if(strlen($old_data)==0){ break; } $moji=mb_substr($old_data,0,1,'UTF-8'); $old_data=mb_substr($old_data,1,mb_strlen($old_data),'UTF-8'); //内部絵文字に変換する。 $output=preg_replace_callback('/\xEE([\x80\x81\x84\x85\x88\x89\x8C\x8D\x90\x91\x94][\x80-\xBF])/','emoji_input',$moji); $new_data.=$output; } return $new_data; }

    • ベストアンサー
    • PHP
  • 改行コードを含む文字列の分割について

    Java初心者です。 Java言語で、ある文字列を"\r\n"だけを区切り記号として別々の文字列にしたいのですがうまくいきません。 StringTokenizerを使って、 StringTokenizer(msg,"\\r\\n") のようにやって見たのですが、これだと"\r"や"\n"まで区切り記号として分割されてしまいました。 "\r\n"だけを区切り記号として処理するにはどうしたらいいでしょうか? 例えばPOSTで送信した"データ1\r\nデータ2\r\nデータ3\nテスト"という文字列を、 "データ1"、"データ2"、"データ3\nテスト"の3つにしたいのですが。

    • ベストアンサー
    • Java

専門家に質問してみよう