携帯絵文字の掲示板のエラーとサンプルコードの有無について

このQ&Aのポイント
  • 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
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.3

No2のサンプルの訂正 $so = "\x0F"; です。

future-boy
質問者

お礼

ありがとうございます。 やはり切り替えるための、配列は自作しなきゃいけないんですね。。。 ちょっと大変ですが、やってみます。 最後まで答えていただき本当にありがとうございました。

その他の回答 (2)

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.2

No1のyyr446です。 emoji_input()が無ければ作るしかないですね。 ソフトバンクの絵文字は、x1Bとx0Fでエスケープされた、2バイトのx21~x7Aの文字列でもって、内部の絵文字を表示しているみたいです。 正規表現でマッチさせるパターンの文字列をキーとして対応する内部絵文字コードを値に持つ連想配列を予め準備しておき、関数emoji_input()で絵文字コードを返せばよいわけです。 function emoji_input($matches) { $si = "\x1B"; $so = "\x1B"; $henkan = array("\xEE\x80\x80" => "\x21\x7A",          "\xEE\x80\x81" => "\x21\x7B",    "\xEE\x80\x82" => "\x21\x7C", ・・・・・・・ と対応させたい絵文字を247個設定する ); return $si . $henkan[$matches[1]] . $so }

  • yyr446
  • ベストアンサー率65% (870/1330)
回答No.1

コールバック関数emoji_input()が無いようですが、 ご提示されているソース以外の部分にあるのですか?

関連するQ&A

  • 文字列の文字一文字ずつを解析して結果を表示したいのですが・・・

    たとえば $data="あ5Aいう7えお" という文字列があったとして 一文字ずつの決まった長さの合計を表示しようとおもっています。 $KAZU=mb_strlen($data,"SJIS"); for($i=0;$i!=$KAZU;$i++){      $moji=mb_substr($data,$i,$i,"SJIS");      $moji_size=mb_strwidth($moji,"SJIS");      if($moji_size==2){           $px+=12;      }else{           if(mbereg("/[A-Z]./",$moji)){                $px+=10;           }elseif(mbereg("/[0-9]./",$moji)){                $px+=9;           }elseif(mbereg("/[a-z]./",$moji)){                $px+=8;           }else{                $px+=6;           }      }      if($px>370){           $px=0;           break;      } } print "$px"; $data="あ5Aいう7えお"の場合結果は(12+9+8+12+12+9+12+12=)86になってほしい この方法でやってもうまくいきませんでした。なんだか面倒なことしているような気もしますが、もっと簡単な方法など知っている方などいらっしゃいましたら、どなたか教えていただければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • 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
  • 文字列変換について

    質問させてください。 携帯のサイトで各種(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
  • 携帯サイトでの絵文字対応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
  • C言語 strlen 再入力を促す

    文字列の比較で、 文字列の長さが60以上の時、再入力を促します。 while文を使って書いてみたのですが、 文字列Bの入力の前に、もう一度意味もなく 「文字列Aを入力===>」が表示されたり。 文字列Aのほうが小さいのに「Aのほうが大きい」と 表示されるようになったり、変な感じです。 どなたかご指摘・ご指導のほどよろしくお願いします。 int main(void) { char moji1[100]; char moji2[100]; while(strlen(moji1)>60){     printf("文字列Aを入力===>"); scanf("%80s" ,moji1); } while(strlen(moji2)>60){     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);    } if(compare(moji1,moji2)>0){ printf("===AはBより大きい===\n"); } else if(compare(moji1, moji2)<0){ printf("===AはBより小さい===\n"); } else if(compare(moji1, moji2)==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y && *x!=0){ x++; y++; } return (*x-*y); }

  • 携帯からの絵文字を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
  • 文字列カットでの文字化けについて

    文字列のカットなのですが、 mb_substrを使っても最後が文字化けするので、 エンコーディング名を追加したら文字列がカットされなくなってしまいました。 以下のファイル http://www.hp-toolbox.com/rssup.zip に含まれるrssup.phpの 44行目 if (mb_strlen($title,"SJIS") > 46) { 45行目 $title = mb_substr($title,0,46,"SJIS"); $title .= "..."; 46行目 } です。 どなたか上手くいく方法を教えて下さい。 宜しくお願い致します。

    • 締切済み
    • PHP
  • substrで抜き取った全角文字列を正常に表示

    $moji1 = 'あいうえおかきくけこさしすせそ'; $moji2 = 'あいうえお...かきくけこ'; $moji3 = 'なにぬねの'; 上記のような3つの文字列を格納した変数があります。 それぞれの変数を使いリンクを貼りたいのですが、20バイトを超えた変数に対しては、substrで20バイトまでを表示し、リンクするようにします。 以下は$moji1をリンクにするソースです。 $byte = strlen($moji1); if ($byte > 20) {  $moji1 = substr($moji1,0,20); } echo '<a href="#">'.$moji1.'</a>'; moji2、moji3も全く同じ処理をします。 結果はmoji1、moji3は上手くいくのですが、moji2に関しては <a href="#">あいうえお...かき/a> このように</a>の'<'が消えてしまいます。 恐らく、20バイト目が全角で、表示が上手くいっていないのだと思うのですが、対処法がわかりません。 今は全角に変換してごまかしていますが、半角のものはなるべく半角で表示したいのです。 moji2を正常に表示させるには、どのような書き方をすれば良いのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • PHP
  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

専門家に質問してみよう