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

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

Last change on this file since 4069 was 4069, checked in by ogawa, 13 years ago

#1244:携帯絵文字のDB保存形式の変更(%%i95%% -> [i:95])

File size: 6.7 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
7require_once 'OpenPNE/KtaiEmoji.php';
8
9function emoji_escape($str, $remove = false)
10{
11    $result = '';
12    for ($i = 0; $i < strlen($str); $i++) {
13        $emoji = '';
14        $c1 = ord($str[$i]);
15        if ($GLOBALS['__Framework']['carrier'] == 's') {
16            if ($c1 == 0xF7 || $c1 == 0xF9 || $c1 == 0xFB) {
17                $bin = substr($str, $i, 2);
18                $emoji = emoji_escape_s($bin);
19            }
20        } elseif ($c1 == 0xF8 || $c1 == 0xF9) {
21            $bin = substr($str, $i, 2);
22            $emoji = emoji_escape_i($bin);
23        } elseif (0xF3 <= $c1 && $c1 <= 0xF7) {
24            $bin = substr($str, $i, 2);
25            $emoji = emoji_escape_e($bin);
26        }
27        if ($emoji) {
28            if (!$remove) {
29                $result .= $emoji;
30            }
31            $i++;
32        } else {
33            $result .= $str[$i];
34            if ((0x81 <= $c1 && $c1 <= 0x9F) || 0xE0 <= $c1) {
35                $result .= $str[$i+1];
36                $i++;
37            }
38        }
39    }
40    return $result;
41}
42
43function emoji_escape_i($bin)
44{
45    $iemoji = '\xF8[\x9F-\xFC]|\xF9[\x40-\xFC]';
46    if (preg_match('/'.$iemoji.'/', $bin)) {
47        $unicode = mb_convert_encoding($bin, 'UCS2', 'SJIS-win');
48        $emoji_code = OpenPNE_KtaiEmoji::getInstance();
49        $code = $emoji_code->get_emoji_code4emoji(sprintf('&#x%02X%02X;', ord($unicode[0]), ord($unicode[1])), 'i');
50        return '['.$code.']';
51    } else {
52        return '';
53    }
54}
55
56function emoji_escape_e($bin)
57{
58    $sjis = (ord($bin[0]) << 8) + ord($bin[1]);
59    if ($sjis >= 0xF340 && $sjis <= 0xF493) {
60        if ($sjis <= 0xF352) {
61            $unicode = $sjis - 3443;
62        } elseif ($sjis <= 0xF37E) {
63            $unicode = $sjis - 2259;
64        } elseif ($sjis <= 0xF3CE) {
65            $unicode = $sjis - 2260;
66        } elseif ($sjis <= 0xF3FC) {
67            $unicode = $sjis - 2241;
68        } elseif ($sjis <= 0xF47E) {
69            $unicode = $sjis - 2308;
70        } else {
71            $unicode = $sjis - 2309;
72        }
73    } elseif ($sjis >= 0xF640 && $sjis <= 0xF7FC) {
74        if ($sjis <= 0xF67E) {
75            $unicode = $sjis - 4568;
76        } elseif ($sjis <= 0xF6FC) {
77            $unicode = $sjis - 4569;
78        } elseif ($sjis <= 0xF77E) {
79            $unicode = $sjis - 4636;
80        } elseif ($sjis <= 0xF7D1) {
81            $unicode = $sjis - 4637;
82        } elseif ($sjis <= 0xF7E4) {
83            $unicode = $sjis - 3287;
84        } else {
85            $unicode = $sjis - 4656;
86        }
87    } else {
88        return '';
89    }
90    $emoji_code = OpenPNE_KtaiEmoji::getInstance();
91    $code = $emoji_code->get_emoji_code4emoji(sprintf('&#x%04X;', $unicode), 'e');
92    return '['.$code.']';
93}
94
95function emoji_escape_s($bin)
96{
97    $sjis1 = ord($bin[0]);
98    $sjis2 = ord($bin[1]);
99    $web1 = $web2 = 0;
100    switch ($sjis1) {
101    case 0xF9:
102        if ($sjis2 >= 0x41 && $sjis2 <= 0x7E) {
103            $web1 = ord('G');
104            $web2 = $sjis2 - 0x20;
105        } elseif($sjis2 >= 0x80 && $sjis2 <= 0x9B) {
106            $web1 = ord('G');
107            $web2 = $sjis2 - 0x21;
108        } elseif ($sjis2 >= 0xA1 && $sjis2 <= 0xED) {
109            $web1 = ord('O');
110            $web2 = $sjis2 - 0x80;
111        }
112        break;
113    case 0xF7:
114        if ($sjis2 >= 0x41 && $sjis2 <= 0x7E) {
115            $web1 = ord('E');
116            $web2 = $sjis2 - 0x20;
117        } elseif ($sjis2 >= 0x80 && $sjis2 <= 0x9B) {
118            $web1 = ord('E');
119            $web2 = $sjis2 - 0x21;
120        } elseif ($sjis2 >= 0xA1 && $sjis2 <= 0xF3) {
121            $web1 = ord('F');
122            $web2 = $sjis2 - 0x80;
123        }
124        break;
125    case 0xFB:
126        if ($sjis2 >= 0x41 && $sjis2 <= 0x7E) {
127            $web1 = ord('P');
128            $web2 = $sjis2 - 0x20;
129        } elseif ($sjis2 >= 0x80 && $sjis2 <= 0x8D) {
130            $web1 = ord('P');
131            $web2 = $sjis2 - 0x21;
132        } elseif ($sjis2 >= 0xA1 && $sjis2 <= 0xD7) {
133            $web1 = ord('Q');
134            $web2 = $sjis2 - 0x80;
135        }
136        break;
137    default:
138        return '';
139    }
140    $emoji_code = OpenPNE_KtaiEmoji::getInstance();
141    $code = $emoji_code->get_emoji_code4emoji(pack('c5', 0x1b, 0x24, $web1, $web2, 0x0f), 's');
142    return '['.$code.']';
143}
144
145function emoji_unescape($str, $amp_escaped = false)
146{
147    $amp = ($amp_escaped) ? '&amp;' : '&';
148    $regexp = "/$amp#x(E[0-9A-F]{3});/";
149    return preg_replace_callback($regexp, 'emoji_unescape_callback', $str);
150}
151
152function emoji_unescape_callback($matches)
153{
154    $unicode = hexdec($matches[1]);
155    if (0xE63E <= $unicode && $unicode <= 0xE757) {
156        return emoji_unescape4i($unicode);
157    } elseif ((0xE468 <= $unicode && $unicode <= 0xE5DF) ||
158              (0xEA80 <= $unicode && $unicode <= 0xEB88)) {
159        return emoji_unescape4e($unicode);
160    } else {
161        return $matches[0];
162    }
163}
164
165function emoji_unescape4i($unicode)
166{
167    $ubin = pack('H4', dechex($unicode));
168    return mb_convert_encoding($ubin, 'SJIS-win', 'UCS2');
169}
170
171function emoji_unescape4e($unicode)
172{
173    if (0xE468 <= $unicode  && $unicode <= 0xE5DF) {
174        if ($unicode <= 0xE4A6) {
175            $sjis = $unicode + 4568;
176        } elseif ($unicode <= 0xE523) {
177            $sjis = $unicode + 4569;
178        } elseif ($unicode <= 0xE562) {
179            $sjis = $unicode + 4636;
180        } elseif ($unicode <= 0xE5B4) {
181            $sjis = $unicode + 4637;
182        } elseif ($unicode <= 0xE5CC) {
183            $sjis = $unicode + 4656;
184        } else {
185            $sjis = $unicode + 3443;
186        }
187    } elseif (0xEA80 <= $unicode && $unicode <= 0xEB88) {
188        if ($unicode <= 0xEAAB) {
189            $sjis = $unicode + 2259;
190        } elseif ($unicode <= 0xEAFA) {
191            $sjis = $unicode + 2260;
192        } elseif ($unicode <= 0xEB0D) {
193            $sjis = $unicode + 3287;
194        } elseif ($unicode <= 0xEB3B) {
195            $sjis = $unicode + 2241;
196        } elseif ($unicode <= 0xEB7A) {
197            $sjis = $unicode + 2308;
198        } else {
199            $sjis = $unicode + 2309;
200        }
201    }
202    return pack('H4', dechex($sjis));
203}
204
205function emoji_convert($str)
206{
207    $moji_pattern = '/\[([a-z]:[0-9]+)\]/i';
208    return preg_replace_callback($moji_pattern, '_emoji_convert', $str);
209}
210
211function _emoji_convert($matches)
212{
213    $o_code = $matches[1];
214   
215    switch ($GLOBALS['__Framework']['carrier']) {
216    case 'i':
217    case 'w':
218        $carrior = 'i';
219        break;
220    case 's':
221        $carrior = 's';
222        break;
223    case 'e':
224        $carrior = 'e';
225        break;
226    default:
227        $carrior = null;
228        break;
229    }
230   
231    $emoji_code = OpenPNE_KtaiEmoji::getInstance();
232    $c_emoji = $emoji_code->convert_emoji($o_code, $carrior);
233    if ($c_emoji) {
234        return $c_emoji;
235    } else {
236        return '〓';
237    }
238}
239
240?>
Note: See TracBrowser for help on using the repository browser.