アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんばんわ(^_^ゞ

お世話になります。

前回は絵文字について色々教えてくださりありがとうございましたO(≧∇≦)O !!

なんとかできたみたいです!!でもあと一歩なんです。

[:F***]みたいなコードありますよねっ!!

抽出も格納も無事にできたんですけど…。


AUとDOCOMOで見てたんですけど…。DOCOMOの携帯から入力している絵文字はAUの携帯でも見れるんですけど…AUの携帯から入力しているAUの絵文字はDOCOMOの携帯で見れないんです。


同じハート絵文字です。格納も同じコード [:F***] になっていて抽出も同じコードです。

なんで同じ絵文字の同じコード なのにAUの携帯から絵文字を入力するとDOCOMOの携帯では見れないのですか。

不思議です(._.)

ちなみにphpファイルです。抽出方法に誤りあるからですか…又はそういうものですか。 ちなみに、キャリア別に絵文字をインクルードしてたりはしていません。

A 回答 (4件)

すみません、作成されているものの全体像が見えない為に、何をして何を確認して、どうされたいのかが、良くわかりませんでした。



・作成しているアプリケーション
・絵文字の取得の解決の為に利用されたライブラリや記述方法
・前回の関連する自身の質問のURLの添付
・又は参考にされたサイトのURLなどを添付

上記を記載していただけませんか?

この回答への補足

こんんちわ!


格納方法はこちらです。

$a = mb_convert_encoding($a,"EUC-JP","shift-JIS");
$a = preg_replace('/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $a);

抽出方法はこちらです。

$a = mb_convert_encoding($banner_i, mb_internal_encoding());
$a = preg_replace('/BAD\+(F[346789][0-F]{2})/', '[d:$1]', $a);

どちらも抽出・格納共にAUもドコモも同じ形式です!

補足日時:2009/09/04 17:10
    • good
    • 0

ちょっと処理を整理しますね。



HTMLはSJISでエンコードされてますね?
まず、フォームのtextareaとかから、絵文字の入ったSJISの文字列がPOSTされます。
そのPOSTされたものをPHPスクリプトはEUCでエンコードされてるので、SJIS⇒EUCに変換したいんですよね。
ただ、文字列の中に絵文字が含まれていて、絵文字は各キャリアが勝手に文字コードに埋めたバイナリ値なので、
mb_convert_encodingをそのまま叩いたのでは、正しく変換できません。
そこで、
mb_substitute_character("long");
と指定してやることで、EUCの文字コードに適合しない文字(つまり絵文字)を違う変換方式にしてやります。
そうすると、例えば、SJISの太陽だと、"\xF8\x9F"というバイナリ値になるのが、"BAD+F89F"という文字列に変換されます。

そこで、iinnffooさんが使った正規表現置換、
preg_replace('/BAD\+(F[346789][0-F]{2})/', '[d:$1]', $a);
これが登場します。
データベースに格納する前に、"BAD+F89F"というものを、"[d:F8F9]"という特殊な形に変換してやってます。
これは恐らく、[d(ドコモの):F8F9(バイナリで\xF8\xF9であらわされる絵文字)]という意味なのでしょう。
変てこなバイナリをDBに挿入しないで、バイナリを文字列で表現してからDBに格納するという手法です。

で、DBから値を取得してHTMLに吐き出す際、[d:F8F9]というままでは絵文字で表示されないので
再度元に戻してやりたい。それが、
$a = mb_convert_encoding($a,"EUC-JP","shift-JIS");
$a = preg_replace('/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $a);
この一連のプログラムですね。

ということで、[d:F8F9]をauやsoftbankで正しく表示したい場合は、docomoのF8F9はauのどのコードか、
softbankのどのコードか、というのを見つけてくる変換テーブルがやっぱり結局必要になってしまうわけです。

また、
preg_replace('/BAD\+(ここをauのアドレス範囲)/', '[a:$1]', $a);
preg_replace('/BAD\+(ここをsoftbankのアドレス範囲)/', '[s:$1]', $a);
などという別の正規表現も必要になってきますね。

相互変換は結構大変な作業です。
    • good
    • 0
この回答へのお礼

有り難う御座いますっ(*^-^*)

あれだったんですね・・・。

初めから間違っていたんですね!
教えられた通りに格納方法「バイナリを文字列で表現してからDBに格納する」に変えてみたいと思います。

抽出の場合も相互変換しなければダメなんですね。さらに変換テーブルも作らなければダメなんですね。。。基本的な流れが分かりました。
まずは格納方法からしてみたいと思います。

簡単には出来ないんですね(°o°)
大変勉強になりました。
ソフトバンクはよく分からないので絵文字は使わないようにします。

ありがとうございました!

お礼日時:2009/09/05 15:20

HTMLで表示を確認しているというのを前提としてますが、大丈夫ですよね?



メールだったりすると、各キャリア間で互換しているので、au/docomo/softbankのいずれかの絵文字を使って送信すると、各キャリア間で同じ絵文字が表示されます。
それで表示がされないということだと、メールの送信書式に問題があるかもしれません。

HTMLで、という前提であれば、
PHPでHTMLを出力しているのであれば、
<?php
echo "\xF9\xF8"; //コレは歯を出して笑ってる絵文字のコード
?>
などと記述してやると、バイナリコードを表示してくれます。
太陽として抽出された[d:f908]が本当に太陽としてあっている文字なのであれば、
<?php
echo "\xF9\x08";
?>
として出力して、各携帯電話で確認してみてください。

この回答への補足

こんにちわ(o・・o)

ありがとうございます!!

バイナリコードにしないとダメなんですね。。。

メールじゃいです。phpのhtmlソースです。

ていうことはバイナリコードで格納と言う事って出来たら良いですよね(o^-')b
でも…[d:○○○]は太陽の絵文字
[d:○○○]は曇りの絵文字みたいに出力時に変換しなければいけないんですか。

例えばなんですけど絵文字と一緒に文字も格納されてます。文字の中から[d:○○○]を探しかつバイナリコードに変換させるんですか(^_^ゞ

度々ありがとうございました!!

勉強になりましたっ(^_^)/□☆□\(^_^)

補足日時:2009/09/05 12:23
    • good
    • 0

格納方法とありますが、何から取得した何をどこに格納していて、


何から取得した何を何のために抽出しているのかが分かりません。

>[:F***]
これは何のコードですか?絵文字のコードではなさそうですが。

>preg_replace('/\[d:(F[89][0-F]{2})\]/e', "pack('H*', $1)", $a);
この正規表現で表現されるものはdocomoの絵文字のバイナリコードに対応したもので、auの絵文字に適合しない内容となっております。

au/docomo、似ている絵文字(太陽とか)でも、キャリアによって、バイナリ値は全部違いますので、
docomoから入力された絵文字を抽出する方法と
auから入力された絵文字を抽出する方法は違います。
さらに、docomoから抽出した絵文字は、変換テーブル(対応リスト)などを用いて、auのバイナリ値に変更をかける必要があります。
    • good
    • 0
この回答へのお礼

ありがとうございます(・ω・)

不思議なんですけど・・・格納したときにDBをみた時に同じコード[d:f908]
に格納されてます。

太陽の絵文字も同じコード=同じ抽出方法でもAu端末からは見れます。


でもドコモからみた場合は同じコードでもauの絵文字は見れなくなります。

お礼日時:2009/09/05 01:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!