[リストへもどる]
一括表示
タイトル入力フォームに投稿した絵文字が正常に表示されない
記事No881
投稿日: 2011/09/09(Fri) 17:06:03
投稿者Snuggle
入力フォームに「テスト【絵文字】」のような絵文字を含む文字を入力し
PHP側で出力した場合にはau端末のみ絵文字が?と出力されます。

---------------------------------------------
require_once 'HTML/Emoji.php';
$emoji = HTML_Emoji::getInstance();

$form_text = $request->getParameter('text');
$form_text = $emoji->filter($form_text, 'input');

print_r($form_text);
---------------------------------------------


また、別のスレッドにて同じような事象が発生しているのを
確認した為、以下の処理にて試したところ
au, docomo端末では何も出力されなくなり
softbank端末では絵文字部がのようなコードとなりました。

---------------------------------------------
require_once 'HTML/Emoji.php';
$emoji = HTML_Emoji::getInstance();

$form_text = $request->getParameter('text');
$form_text = $emoji->filter($form_text, 'input');
$form_text = $emoji->filter($form_text, 'Utf8ToHex');
$form_text = $emoji->filter($form_text, 'output');

print_r($form_text);
---------------------------------------------


お手数ではございますが
何卒よろしくお願いいたします。

タイトルRe: 入力フォームに投稿した絵文字が正常に表示されない
記事No882
投稿日: 2011/09/10(Sat) 00:24:08
投稿者revulo
input フィルタで変換した後の絵文字は、バイナリのデータになっているので、
それを直接表示すると確認がしづらいです。こうやってみてはどうでしょうか?

require_once 'HTML/Emoji.php';
$emoji = HTML_Emoji::getInstance();

$sjis = $request->getParameter('text');
$utf8 = $emoji->filter($sjis, 'input');
echo 'SJIS:' . bin2hex($sjis) . ', UTF8:' . bin2hex($utf8);

各キャリアの携帯から晴れの絵文字を入力した場合、PHP の設定が正しければ、

docomo: SJIS:f89a, UTF8:ee98be
au: SJIS:f660, UTF8:eebda0
softbank: SJIS:f98b, UTF8:ee818a

のように表示されるはずです。
(SoftBank は、UTF-8 のページから入力した場合は SJIS:ee818a となります。)

そうならなかった場合は、
http://www.revulo.com/bbs/wforum.cgi?mode=allread&no=697
この辺りの設定を見直してみて下さい。

タイトルRe^2: 入力フォームに投稿した絵文字が正常に表示されない
記事No885
投稿日: 2011/09/12(Mon) 10:30:52
投稿者Snuggle
ご返答いただき、真にありがとうございます。

> require_once 'HTML/Emoji.php';
> $emoji = HTML_Emoji::getInstance();
>
> $sjis = $request->getParameter('text');
> $utf8 = $emoji->filter($sjis, 'input');
> echo 'SJIS:' . bin2hex($sjis) . ', UTF8:' . bin2hex($utf8);

各キャリアの携帯から晴れの絵文字を入力にて確認したところ

docomo: SJIS:f89a, UTF8:ee98be
au: SJIS:f660, UTF8:eebda0
softbank: SJIS:ee818a, UTF8:ee818a

と表示されます。


また、各キャリア別端末にて確認したところ、
下記のように出力されております。

■sjis
docomo: 晴れの絵文字が表示されない
au: 晴れの絵文字が表示されない
softbank: 晴れの絵文字が表示される

■utf8
docomo: 晴れの絵文字が表示される
au: ?が表示される
softbank: 晴れの絵文字が表示される


au端末にて絵文字が出力される為にはどのようにすればよろしいか
ご教授いただけますでしょうか。

タイトルRe^3: 入力フォームに投稿した絵文字が正常に表示されない
記事No886
投稿日: 2011/09/12(Mon) 23:05:18
投稿者revulo
> 各キャリアの携帯から晴れの絵文字を入力にて確認したところ
>
> docomo: SJIS:f89a, UTF8:ee98be
> au: SJIS:f660, UTF8:eebda0
> softbank: SJIS:ee818a, UTF8:ee818a
>
> と表示されます。

ということは、絵文字の入力データは正しく受け取れているようなので、
出力というか、表示の方の問題だと思います。
http://libemoji.com/html_emoji/manual/quickstart
に載っている例そのままですが、header() 関数を追加して、

require_once 'HTML/Emoji.php';
$emoji = HTML_Emoji::getInstance();
$text = $emoji->filter($text, 'input');
//$emoji->utf8 = true;
$text = $emoji->filter($text, 'output');
if ($emoji->isSjisCarrier()) {
header('Content-Type: text/html; charset=Shift_JIS');
} else {
header('Content-Type: text/html; charset=UTF-8');
}

これでうまくいかないでしょうか?
docomo, au は Shift_JIS で、SoftBank は UTF-8 で出力されます。

ただ、au, UTF-8 の組み合わせで ? が表示されたというのが気になります。
上の $emoji->utf8 = true; の行を有効にすると、UTF-8 で出力されますが、
その場合も au で ? と表示されますか?
今のところ、

・header をしっかり出力しないと ? になってしまう?
・UTF-8 では絵文字を表示できない機種がある?

という2つの可能性を考えています。
もし、上記のことを au, UTF-8 で試して ? で表示されるようでしたら、
念のため、au の機種名も教えていただけないでしょうか?

よろしくお願いします。

タイトルRe^4: 入力フォームに投稿した絵文字が正常に表示されない
記事No887
投稿日: 2011/09/13(Tue) 10:53:18
投稿者Snuggle
> require_once 'HTML/Emoji.php';
> $emoji = HTML_Emoji::getInstance();
> $text = $emoji->filter($text, 'input');
> //$emoji->utf8 = true;
> $text = $emoji->filter($text, 'output');
> if ($emoji->isSjisCarrier()) {
> header('Content-Type: text/html; charset=Shift_JIS');
> } else {
> header('Content-Type: text/html; charset=UTF-8');
> }

上記にて「絵文字(晴れ)」を入力したところ、
絵文字が表示されませんでした。

> 上の $emoji->utf8 = true; の行を有効にすると、UTF-8 で出力されますが、
> その場合も au で ? と表示されますか?

こちらも試して見たのですが、
やはり絵文字が?として表示されてしまいます。

確認したau端末は以下となります。
T001
W53H


また、filterのInputを使わずmb_convert_encodingのみで試してみたところ、au端末で絵文字が表示されることを確認いたしました。

$text = mb_convert_encoding($text, 'UTF-8', 'SJIS-win');

そのため、一度こちらでエンコードしている処理を調査してみようと思いますが
そちらで思い当たる箇所等ございましたらお教えいただけますでしょうか。

お手数をおかけして真に申し訳ないのですが
何卒よろしくお願いいたします。

タイトルRe^5: 入力フォームに投稿した絵文字が正常に表示されない
記事No888
投稿日: 2011/09/14(Wed) 00:49:47
投稿者revulo
> また、filterのInputを使わずmb_convert_encodingのみで試してみたところ、au端末で絵文字が表示されることを確認いたしました。
>
> $text = mb_convert_encoding($text, 'UTF-8', 'SJIS-win');

au の絵文字は、mb_convert_encoding では正しく変換できないはずなので、
それもおかしな気がするのですが……。
何が原因なのかよく分からないので、いろいろ書いてみます。

まず、この2つのサンプルはどう表示されますか?
どのキャリアの携帯でも、4種類の絵文字が表示されるはずです。

http://libemoji.com/example/utf8.php
http://libemoji.com/example/utf8_to_sjis.php

HTML_Emoji の examples ディレクトリに同じサンプルが入っていますので、
それをそちらのサーバでも試してみて下さい。
もし結果が違ったら、サーバの設定の問題だと思います。

次に、HTML/Emoji/Au.php に _convertSjisToUtf8 という関数があります。
この関数の中身は、

$text = mb_encode_numericentity($text, $this->_sjismap, 'SJIS-win');
$text = mb_convert_encoding($text, 'UTF-8', 'SJIS-win');
return $this->decodeNumericentity($text, $this->_utf8map, 'UTF-8');

のようになっています。これを例えば、

echo bin2hex($text);
$text = mb_encode_numericentity($text, $this->_sjismap, 'SJIS-win');
echo bin2hex($text);
$text = mb_convert_encoding($text, 'UTF-8', 'SJIS-win');
echo bin2hex($text);
$text = $this->decodeNumericentity($text, $this->_utf8map, 'UTF-8');
echo bin2hex($text);
return $text;

のようにするなどして、各行でどのような値に変換されているのか、
チェックしてみていただけないでしょうか?

また、mb_convert_encoding 単体で変換してうまくいった場合には、
どのような値からどのような値に変換されているのか、チェックしてみて下さい。

あと、違うかもしれませんが、どこかで HTML_Emoji 以外の何かが、
エンコーディングの変換を行ったりしていないでしょうか?
例えばですが、mb_convert_encoding($text, 'SJIS-win' 'UTF-8') という変換が、
出力時に行われていると仮定すると、
mb_convert_encoding($text, 'UTF-8', 'SJIS-win') で au の絵文字が変換できた、
というのも説明が付きます。

タイトルRe^6: 入力フォームに投稿した絵文字が正常に表示されない
記事No889
投稿日: 2011/09/15(Thu) 15:18:13
投稿者Snuggle
> まず、この2つのサンプルはどう表示されますか?
> どのキャリアの携帯でも、4種類の絵文字が表示されるはずです。
>
> http://libemoji.com/example/utf8.php
> http://libemoji.com/example/utf8_to_sjis.php

該当のau端末でサンプルを確認により絵文字が
正常に表示されることを確認いたしました。

また、上記サンプルをこちらのサーバーでも確認したのですが、
やはり絵文字が?と表示されてしまいます。


> echo bin2hex($text);
> $text = mb_encode_numericentity($text, $this->_sjismap, 'SJIS-win');
> echo bin2hex($text);
> $text = mb_convert_encoding($text, 'UTF-8', 'SJIS-win');
> echo bin2hex($text);
> $text = $this->decodeNumericentity($text, $this->_utf8map, 'UTF-8');
> echo bin2hex($text);
> return $text;
>
> のようにするなどして、各行でどのような値に変換されているのか、
> チェックしてみていただけないでしょうか?

au端末にて晴れの絵文字を表示したところ、
下記のように表示されることを確認いたしました。

f660
262336333037323b
262336333037323b


> あと、違うかもしれませんが、どこかで HTML_Emoji 以外の何かが、
> エンコーディングの変換を行ったりしていないでしょうか?

本件についてですが、phpのフレームワーク(Symony1.4)にて
HTML_Emojiを導入した場合に絵文字が?と表示されておりました。

そのため、同じサーバーのSymfonyプロジェクト外にて
HTNL_Emojiのサンプルコードを試してみたところ、
該当のau端末でも絵文字が正常に表示されることが確認できましたので
Symfony側でエンコーディングの変換が行われているかと思われます。

今後はSymfonyでエンコーディングの変換が行われていないか
調査してみようと思います。

お忙しい中、ご対応いただき真にありがとうございました。