Posted By

daisuke103 on 02/26/09


Tagged

php textmate utf8 sjis emoji


Versions (?)

PHP 携帯 sjis絵文字をUTF8へ


 / Published in: Other
 

  1. $str = '[SJISバイナリ絵文字コードを含む文字列]';
  2.  
  3. // 文字コードを設定
  4. mb_internal_encoding('SJIS');
  5. mb_regex_encoding('SJIS');
  6.  
  7. // 正規表現を定義
  8. $sjis = '[\x81-\x9F\xE0-\xF7\xFA-\xFC][\x40-\x7E\x80-\xFC]
  9. |[\x00-\x7F]|[\xA1-\xDF]'; // 実際には1行で入力
  10. $emoji = '[\xF8\xF9][\x40-\x7E\x80-\xFC]';
  11. $pattern = "/\G((?:$sjis)*)(?:($emoji))/";
  12.  
  13. // 絵文字を検索
  14. preg_match_all($pattern, $str, $arr); // $arr[2]に対象絵文字が格納される
  15.  
  16. // 絵文字を置換
  17. $rep_arr = array();
  18. foreach($arr[2] as $value) {
  19. $emoji_cd = unpack("C*", $value);
  20. $hex = dechex($emoji_cd[1]) . dechex($emoji_cd[2]);
  21. $dec = hexdec($hex);
  22. if (63647 <= $dec AND $dec <= 63740) {
  23. // 絵文字No.1 ~ No.94
  24. $dec = $dec - 4705;
  25. } elseif (63872 <= $dec AND $dec <= 63996) {
  26. // 絵文字No.118 ~ No.166、拡1~拡76
  27. $dec = $dec - 4773;
  28. } elseif ((63808 <= $dec AND $dec <= 63817) OR
  29. (63824 <= $dec AND $dec <= 63826) OR
  30. (63829 <= $dec AND $dec <= 63831) OR
  31. (63835 <= $dec AND $dec <= 63838) OR
  32. (63858 <= $dec AND $dec <= 63870)) {
  33. // 絵文字No.95 ~ No.117、No.167 ~ No.176
  34. $dec = $dec - 4772;
  35. } else {
  36. continue;
  37. }
  38. $replacement = '&#' . strtoupper(dechex($dec)) . ';';
  39. $str = mb_ereg_replace($value, $replacement, $str);
  40. }
  41.  
  42. // 置換処理
  43. $str = strtr($str, $rep_arr);
  44.  
  45. // 出力
  46. echo $str;
  47.  

Report this snippet  

You need to login to post a comment.