読者です 読者をやめる 読者になる 読者になる

utf8で3キャリア対応サイトを作成する際に、auの絵文字が小さくならない件の対応 (php emoji utf8

cakePHP + smarty + 絵文字表示 - 雑想空間 これの続き、っちゃー続き。

auの絵文字を表示させる方法は何種類かあるんですが、imgタグで表示させると、fontタグやspanタグのstyleでサイズ指定しても、連動して小さくなってくれません。
au絵文字を大きくする、小さくする - [au [KDDI EZweb]/携帯] ぺんたん info

こちらにも書いてあるように、




このように書けばokですが、

<img localsrc="51" />

imgタグで指定すると、サイズが固定されて、変動しません。

cake php + smarty

cake phpsmarty を利用してサイトを作成した時に、
Smarty で携帯絵文字 - ZeBeVogue別館
こちらの関数にお世話になったのですが、

			case "e";
				if (preg_match("/[^0-9]/", $emoji_array[$data][2])) {
					$put = $emoji_array[$data][2];
				} else {
					$put = "<img localsrc=\"".$emoji_array[$data][2]."\" />";
				}
				break;

基本的には、imgタグで表示するので、文字サイズとともにサイズ変更してくれません。


webコード(SJIS)で書き直そうと思い、規則性やマッピングについて久々に探したら、2007年にすでに解決してました。
KDDI/AUでutf-8のHTMLフォームから送られてくる絵文字コード - Bulknews::Subtech - subtech
EZweb (au) 絵文字の規則性 - 覇王色を求めて
utf-8のサイトでformから送信された場合の対処法をまとめてありますが、普通にwebコード(SJIS)からエンコードしなおす場合にも利用できそうです。

<?php
// eebd89
echo bin2hex(mb_convert_encoding(pack('H*', dechex(hexdec("F649") - 1792)), 'UTF-8', 'unicode'));
?>

ちょっと書き換え

まず絵文字のマッピング表に、新たに、auのwebコード(SJIS)を追加します
表は
絵文字を使いこなして見るためのページ【Docomo】全ページ
こちらから拝借

  1,&#58942;,44,Gj,F660
  2,&#58943;,107,Gi,F665
  3,&#58944;,95,Gk,F664
  4,&#58945;,191,Gh,F65D

末尾に追加してみました。


コードもちょっと変えます

 23     // au の絵文字表示形式
 24     $au_conv = 1; // 0 default 1 size依存
 25 
 26     //携帯UA取得
 27     $agent = $_SERVER["HTTP_USER_AGENT"];
 28     if(preg_match("/[0-9]{1,3}/", $data) && is_numeric($data) && 0 < $data && $data < 253) {
 29         switch (mobile($agent)) {
 30             case "i";
 31                 $put = $emoji_array[$data][1];
 32                 break;
 33             case "e";
 34                 if ($au_conv == 1) {
 35                     if (preg_match("/^[A-F0-9]+$/", $emoji_array[$data][4])) {
 36                         $put = mb_convert_encoding(pack('H*', dechex(hexdec($emoji_array[$data][4]) - 1792)), 'UTF-8', 'unicode');
 37                     }
 38                     else {
 39                         $put = $emoji_array[$data][4];
 40                     }
 41                 }
 42                 elseif (preg_match("/[^0-9]/", $emoji_array[$data][2])) {
 43                     $put = $emoji_array[$data][2];
 44                 } else {
 45                     $put = "<img localsrc=\"".$emoji_array[$data][2]."\" />";
 46                 }
 47                 break;
 48             case "s";
 49                 if (preg_match("/^[A-Z]{1}?/", $emoji_array[$data][3])) {
 50                     $put = "\x1B\$".encode($emoji_array[$data][3])."\x0F";
 51                 } else {
 52                     $put = encode($emoji_array[$data][3]);
 53                 }
 54                 break;
 55             case "p";
 56                 $put = "<img src=\""."/img/mobile/".$emoji_array[$data][0].".gif\" width=\"12\" height=\"12\" border=\"0\" alt=\"\" />";
 57                 break;
 58         }


これで

{emoji num=1}

で、絵文字表示できて、文字サイズに依存する絵文字が出ました