ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/trunk/webapp/lib/util/emoji.php @ 1856

Last change on this file since 1856 was 1856, checked in by takanashi, 13 years ago

copyright表記修正

File size: 4.1 KB
Line 
1<?php
2/**
3 * @copyright 2005-2007 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7function emoji_escape($str, $remove = false)
8{
9    $result = '';
10    for ($i = 0; $i < strlen($str); $i++) {
11        $emoji = '';
12        $c1 = ord($str[$i]);
13        if ($c1 == 0xF8 || $c1 == 0xF9) {
14            $bin = substr($str, $i, 2);
15            $emoji = emoji_escape_i($bin);
16        } elseif (0xF3 <= $c1 && $c1 <= 0xF7) {
17            $bin = substr($str, $i, 2);
18            $emoji = emoji_escape_ez($bin);
19        }
20        if ($emoji) {
21            if (!$remove) {
22                $result .= $emoji;
23            }
24            $i++;
25        } else {
26            $result .= $str[$i];
27            if ((0x81 <= $c1 && $c1 <= 0x9F) || 0xE0 <= $c1) {
28                $result .= $str[$i+1];
29                $i++;
30            }
31        }
32    }
33    return $result;
34}
35
36function emoji_escape_i($bin)
37{
38    $iemoji = '\xF8[\x9F-\xFC]|\xF9[\x40-\xFC]';
39    if (preg_match('/'.$iemoji.'/', $bin)) {
40        $unicode = mb_convert_encoding($bin, 'UCS2', 'SJIS-win');
41        return sprintf('&#x%02X%02X;', ord($unicode[0]), ord($unicode[1]));
42    } else {
43        return '';
44    }
45}
46
47function emoji_escape_ez($bin)
48{
49    $sjis = (ord($bin[0]) << 8) + ord($bin[1]);
50    if ($sjis >= 0xF340 && $sjis <= 0xF493) {
51        if ($sjis <= 0xF352) {
52            $unicode = $sjis - 3443;
53        } elseif ($sjis <= 0xF37E) {
54            $unicode = $sjis - 2259;
55        } elseif ($sjis <= 0xF3CE) {
56            $unicode = $sjis - 2260;
57        } elseif ($sjis <= 0xF3FC) {
58            $unicode = $sjis - 2241;
59        } elseif ($sjis <= 0xF47E) {
60            $unicode = $sjis - 2308;
61        } else {
62            $unicode = $sjis - 2309;
63        }
64    } elseif ($sjis >= 0xF640 && $sjis <= 0xF7FC) {
65        if ($sjis <= 0xF67E) {
66            $unicode = $sjis - 4568;
67        } elseif ($sjis <= 0xF6FC) {
68            $unicode = $sjis - 4569;
69        } elseif ($sjis <= 0xF77E) {
70            $unicode = $sjis - 4636;
71        } elseif ($sjis <= 0xF7D1) {
72            $unicode = $sjis - 4637;
73        } elseif ($sjis <= 0xF7E4) {
74            $unicode = $sjis - 3287;
75        } else {
76            $unicode = $sjis - 4656;
77        }
78    } else {
79        return '';
80    }
81    return sprintf('&#x%04X;', $unicode);
82}
83
84function emoji_unescape($str, $amp_escaped = false)
85{
86    $amp = ($amp_escaped) ? '&amp;' : '&';
87    $regexp = "/$amp#x(E[0-9A-F]{3});/";
88    return preg_replace_callback($regexp, 'emoji_unescape_callback', $str);
89}
90
91function emoji_unescape_callback($matches)
92{
93    $unicode = hexdec($matches[1]);
94    if (0xE63E <= $unicode && $unicode <= 0xE757) {
95        return emoji_unescape4i($unicode);
96    } elseif ((0xE468 <= $unicode && $unicode <= 0xE5DF) ||
97              (0xEA80 <= $unicode && $unicode <= 0xEB88)) {
98        return emoji_unescape4ez($unicode);
99    } else {
100        return $matches[0];
101    }
102}
103
104function emoji_unescape4i($unicode)
105{
106    $ubin = pack('H4', dechex($unicode));
107    return mb_convert_encoding($ubin, 'SJIS-win', 'UCS2');
108}
109
110function emoji_unescape4ez($unicode)
111{
112    if (0xE468 <= $unicode  && $unicode <= 0xE5DF) {
113        if ($unicode <= 0xE4A6) {
114            $sjis = $unicode + 4568;
115        } elseif ($unicode <= 0xE523) {
116            $sjis = $unicode + 4569;
117        } elseif ($unicode <= 0xE562) {
118            $sjis = $unicode + 4636;
119        } elseif ($unicode <= 0xE5B4) {
120            $sjis = $unicode + 4637;
121        } elseif ($unicode <= 0xE5CC) {
122            $sjis = $unicode + 4656;
123        } else {
124            $sjis = $unicode + 3443;
125        }
126    } elseif (0xEA80 <= $unicode && $unicode <= 0xEB88) {
127        if ($unicode <= 0xEAAB) {
128            $sjis = $unicode + 2259;
129        } elseif ($unicode <= 0xEAFA) {
130            $sjis = $unicode + 2260;
131        } elseif ($unicode <= 0xEB0D) {
132            $sjis = $unicode + 3287;
133        } elseif ($unicode <= 0xEB3B) {
134            $sjis = $unicode + 2241;
135        } elseif ($unicode <= 0xEB7A) {
136            $sjis = $unicode + 2308;
137        } else {
138            $sjis = $unicode + 2309;
139        }
140    }
141    return pack('H4', dechex($sjis));
142}
143
144?>
Note: See TracBrowser for help on using the repository browser.