Annotation of embedaddon/php/ext/mbstring/libmbfl/filters/mk_emoji_tbl.pl, revision 1.1.1.1
1.1 misho 1: #!/usr/bin/perl
2: # script to generate Shift_JIS encoded Emoji to/from Unicode conversion table.
3: # Rui Hirokawa <hirokawa@php.net>
4: #
5: # usage: mktbl.pl EmojiSources.txt
6: #
7: # Unicoe;DoCoMo;KDDI;SoftBank
8:
9: @docomo = ();
10: @kddi = ();
11: @softbank = ();
12:
13: @to_docomo = ();
14: @to_kddi = ();
15: @to_sb = ();
16:
17: $fname = "emoji2uni.h";
18: open(OUT,">$fname") or die $!;
19:
20: sub sjis2code {
21: my @c = unpack("C*", pack("H4", $_[0]));
22:
23: # Shift_JIS -> JIS
24: $c[0] = (($c[0]-($c[0]<160?112:176))<<1)-($c[1]<159?1:0);
25: $c[1] -= ($c[1]<159?($c[1]>127?32:31):126);
26:
27: $s = ($c[0] - 0x21)*94 + $c[1]-0x21;
28:
29: return $s;
30: }
31:
32: sub show_code {
33: my @c = @_;
34: $s = "\t";
35: for ($i=0; $i<=$#c; $i++) {#
36: if ($c[$i]) {
37: @v = split(' ',$c[$i]);
38: $s .= "0x$v[0], \t";
39: if ($#v > 0) {
40: print "$i $v[0] $v[1]\n";
41: }
42: } else {
43: $s .= "0x0000, \t";
44: }
45: if ($i % 4 == 3) {
46: $s .= "\n\t";
47: }
48: }
49: return $s;
50: }
51:
52: while(<>) {
53: if ($_ =~ /^\d+/) {
54: @v = split(/;/,$_);
55: if ($v[1] =~ /[\dA-F]+/) {
56: $code = &sjis2code($v[1]);
57: $docomo{$code} = $v[0];
58: $to_docomo{$v[0]} = $code;
59: }
60: if ($v[2] =~ /[\dA-F]+/) {
61: $code = &sjis2code($v[2]);
62: $kddi{$code} = $v[0];
63: $to_kddi{$v[0]} = $code;
64: }
65: if ($v[3] =~ /[\dA-F]+/) {
66: $code = &sjis2code($v[3]);
67: $softbank{$code} = $v[0];
68: $to_sb{$v[0]} = $code;
69: }
70: }
71: }
72:
73: print "DoCoMo\n";
74:
75: $docomo_min = 10434;
76: $docomo_max = 10434+281;
77: @docomo_v = ();
78:
79: foreach $key (sort {hex($a) <=> hex($b)} keys(%docomo)) {
80: $s = $key;
81: $pos = $s % 94;
82: $ku = ($s - $pos)/94;
83: $v = $key - $docomo_min;
84: #print "$ku:$pos - ". $v ."=> $docomo{$key}\n";
85: $docomo_v[$key-$docomo_min] = $docomo{$key};
86: }
87:
88: $to_docomo_min = 10434;
89:
90: $to_docomo_min1 = 0x0023;
91: $to_docomo_max1 = 0x00AE;
92: $to_docomo_min2 = 0x203C;
93: $to_docomo_max2 = 0x3299;
94: $to_docomo_min3 = 0x1F17F;
95: $to_docomo_max3 = 0x1F6BB;
96:
97: @r_docomo1_key = ();
98: @r_docomo1_val = ();
99:
100: @r_docomo2_key = ();
101: @r_docomo2_val = ();
102:
103: @r_docomo3_key = ();
104: @r_docomo3_val = ();
105:
106:
107: foreach $key (sort {hex($a) <=> hex($b)} keys(%to_docomo)) {
108: $s = $to_docomo{$key};
109:
110: $pos = $s % 94;
111: $ku = ($s - $pos)/94;
112: $v = $to_docomo{$key} - $to_docomo_min;
113: $h = sprintf("%x",$s);
114: #print "$ku:$pos = $h ($v) <= $key\n";
115: if (hex($key) <= $to_docomo_max1) {
116: push(@r_docomo1_key, $key);
117: push(@r_docomo1_val, sprintf("%x", $to_docomo{$key}));
118: } elsif (hex($key) <= $to_docomo_max2) {
119: push(@r_docomo2_key, $key);
120: push(@r_docomo2_val, $h);
121: } elsif (hex($key) >= $to_docomo_max3) {
122: push(@r_docomo3_key, $key);
123: push(@r_docomo3_val, $h);
124: }
125: }
126:
127: push(@r_docomo1_key, 0x00);
128: push(@r_docomo1_val, 0x00);
129: push(@r_docomo2_key, 0x00);
130: push(@r_docomo2_val, 0x00);
131: push(@r_docomo3_key, 0x00);
132: push(@r_docomo3_val, 0x00);
133:
134: print OUT "int mb_tbl_code2uni_docomo_min = $docomo_min;\n";
135: print OUT "int mb_tbl_code2uni_docomo_max = $docomo_max;\n\n";
136:
137: print OUT "int mb_tbl_code2uni_docomo[] = {\n";
138: print OUT &show_code(@docomo_v);
139: print OUT "};\n\n";
140:
141: print OUT "int mb_tbl_uni_docomo2code_min1 = $to_docomo_min1;\n";
142: print OUT "int mb_tbl_uni_docomo2code_max1 = $to_docomo_max1;\n";
143: print OUT "int mb_tbl_uni_docomo2code_min2 = $to_docomo_min2;\n";
144: print OUT "int mb_tbl_uni_docomo2code_max2 = $to_docomo_max2;\n";
145: print OUT "int mb_tbl_uni_docomo2code_min3 = $to_docomo_min3;\n";
146: print OUT "int mb_tbl_uni_docomo2code_max3 = $to_docomo_max3;\n\n";
147:
148: #print "DOCOMO reverse 1\n";
149:
150: print OUT "int mb_tbl_uni_docomo2code_key1[] = {\n";
151: print OUT &show_code(@r_docomo1_key),"\n";
152: print OUT "};\n\n";
153: print OUT "int mb_tbl_uni_docomo2code_val1[] = {\n";
154: print OUT &show_code(@r_docomo1_val),"\n";
155: print OUT "};\n\n";
156:
157: #print "DOCOMO reverse 2\n";
158:
159: print OUT "int mb_tbl_uni_docomo2code_key2[] = {\n";
160: print OUT &show_code(@r_docomo2_key),"\n";
161: print OUT "};\n\n";
162: print OUT "int mb_tbl_uni_docomo2code_val2[] = {\n";
163: print OUT &show_code(@r_docomo2_val),"\n";
164: print OUT "};\n\n";
165:
166: print "DOCOMO reverse 3\n";
167:
168: print OUT "int mb_tbl_uni_docomo2code_key3[] = {\n";
169: print OUT &show_code(@r_docomo3_key),"\n";
170: print OUT "};\n\n";
171: print OUT "int mb_tbl_uni_docomo2code_val3[] = {\n";
172: print OUT &show_code(@r_docomo3_val),"\n";
173: print OUT "};\n\n";
174:
175: #print "DOCOMO reverse end \n";
176:
177: $kddi_min1 = 9400;
178: $kddi_max1 = 9400+264;
179: $kddi_min2 = 9400+564;
180: $kddi_max2 = 9400+939;
181:
182: @kddi_v1 = ();
183: @kddi_v2 = ();
184:
185: #print "KDDI\n";
186:
187: foreach $key (sort {hex($a) <=> hex($b)} keys(%kddi)) {
188: $s = $key;
189: $pos = $s % 94;
190: $ku = ($s - $pos)/94;
191: $v = $key - $kddi_min1;
192: $h = sprintf("%x",$key);
193: #print "$ku:$pos :: $v ($h) => $kddi{$key}\n";
194:
195: if ($key <= $kddi_max1) {
196: $kddi_v1[$key-$kddi_min1] = $kddi{$key};
197: } elsif ($key <= $kddi_max2) {
198: $kddi_v2[$key-$kddi_min2] = $kddi{$key};
199: }
200: }
201:
202: $to_kddi_min = 9660;
203: $to_kddi_min1 = 0x0030;
204: $to_kddi_max1 = 0x00AE;
205: $to_kddi_min2 = 0x2002;
206: $to_kddi_max2 = 0x3299;
207: $to_kddi_min3 = 0x1F004;
208: $to_kddi_max3 = 0x1F6C0;
209:
210: @r_kddi1_key = (); @r_kddi1_val = ();
211: @r_kddi2_key = (); @r_kddi2_val = ();
212: @r_kddi3_key = (); @r_kddi3_val = ();
213:
214: foreach $key (sort {hex($a) <=> hex($b)} keys(%to_kddi)) {
215: $s = $to_kddi{$key};
216:
217: $pos = $s % 94;
218: $ku = ($s - $pos)/94;
219: $v = $to_kddi{$key} - $to_kddi_min;
220: $h = sprintf("%x",$s);
221: #print "$ku:$pos = $h ($v) <= $key\n";
222: if (hex($key) <= $to_kddi_max1) {
223: push(@r_kddi1_key, $key);
224: push(@r_kddi1_val, $h);
225: } elsif (hex($key) <= $to_kddi_max2) {
226: push(@r_kddi2_key, $key);
227: push(@r_kddi2_val, $h);
228: } else {
229: push(@r_kddi3_key, $key);
230: push(@r_kddi3_val, $h);
231: }
232: }
233:
234: push(@r_kddi1_key, 0x00);
235: push(@r_kddi1_val, 0x00);
236: push(@r_kddi2_key, 0x00);
237: push(@r_kddi2_val, 0x00);
238: push(@r_kddi3_key, 0x00);
239: push(@r_kddi3_val, 0x00);
240:
241: print OUT "int mb_tbl_code2uni_kddi1_min = $kddi_min1;\n";
242: print OUT "int mb_tbl_code2uni_kddi1_max = $kddi_max1;\n";
243: print OUT "int mb_tbl_code2uni_kddi2_min = $kddi_min2;\n";
244: print OUT "int mb_tbl_code2uni_kddi2_max = $kddi_max2;\n\n";
245:
246: #print "KDDI 1\n";
247:
248: print OUT "int mb_tbl_code2uni_kddi1[] = {\n";
249: print OUT &show_code(@kddi_v1);
250: print OUT "};\n\n";
251:
252: #print "KDDI 2\n";
253:
254: print OUT "int mb_tbl_code2uni_kddi2[] = {\n";
255: print OUT &show_code(@kddi_v2);
256: print OUT "};\n\n";
257:
258: print OUT "int mb_tbl_uni_kddi2code_min1 = $to_kddi_min1;\n";
259: print OUT "int mb_tbl_uni_kddi2code_max1 = $to_kddi_max1;\n";
260: print OUT "int mb_tbl_uni_kddi2code_min2 = $to_kddi_min2;\n";
261: print OUT "int mb_tbl_uni_kddi2code_max2 = $to_kddi_max2;\n";
262: print OUT "int mb_tbl_uni_kddi2code_min3 = $to_kddi_min3;\n";
263: print OUT "int mb_tbl_uni_kddi2code_max3 = $to_kddi_max3;\n\n";
264:
265: #print "KDDI reverse 1\n";
266:
267: print OUT "int mb_tbl_uni_kddi2code_key1[] = {\n";
268: print OUT &show_code(@r_kddi1_key),"\n";
269: print OUT "};\n\n";
270: print OUT "int mb_tbl_uni_kddi2code_val1[] = {\n";
271: print OUT &show_code(@r_kddi1_val),"\n";
272: print OUT "};\n\n";
273:
274: #print "KDDI reverse 1\n";
275:
276: print OUT "int mb_tbl_uni_kddi2code_key2[] = {\n";
277: print OUT &show_code(@r_kddi2_key),"\n";
278: print OUT "};\n\n";
279: print OUT "int mb_tbl_uni_kddi2code_val2[] = {\n";
280: print OUT &show_code(@r_kddi2_val),"\n";
281: print OUT "};\n\n";
282:
283: #print "KDDI reverse 3\n";
284:
285: print OUT "int mb_tbl_uni_kddi2code_key3[] = {\n";
286: print OUT &show_code(@r_kddi3_key),"\n";
287: print OUT "};\n\n";
288: print OUT "int mb_tbl_uni_kddi2code_val3[] = {\n";
289: print OUT &show_code(@r_kddi3_val),"\n";
290: print OUT "};\n\n";
291:
292:
293: $sb_min1 = 10153;
294: $sb_max1 = 10153+177;
295: $sb_min2 = 10153+376;
296: $sb_max2 = 10153+547;
297: $sb_min3 = 10153+752;
298: $sb_max3 = 10153+901;
299:
300: @sb_v1 = ();
301: @sb_v2 = ();
302: @sb_v3 = ();
303:
304: if (1) {
305: print "SoftBank\n";
306:
307: foreach $key (sort {hex($a) <=> hex($b)} keys(%softbank)) {
308: $s = $key;
309: $pos = $s % 94;
310: $ku = ($s - $pos)/94;
311: $v = $key - $sb_min1;
312: $h = sprintf("%x",$key);
313: #print "$ku:$pos :: $v ($h) => $softbank{$key}\n";
314: if ($key <= $sb_max1) {
315: $sb_v1[$key-$sb_min1] = $softbank{$key};
316: } elsif ($key <= $sb_max2) {
317: $sb_v2[$key-$sb_min2] = $softbank{$key};
318: } elsif ($key <= $sb_max3) {
319: $sb_v3[$key-$sb_min3] = $softbank{$key};
320: }
321: }
322:
323: }
324:
325: $to_sb_min = 10263;
326: $to_sb_min1 = 0x0023;
327: $to_sb_max1 = 0x00AE;
328: $to_sb_min2 = 0x2122;
329: $to_sb_max2 = 0x3299;
330: $to_sb_min3 = 0x1F004;
331: $to_sb_max3 = 0x1F6C0;
332:
333: @r_sb1_key = (); @r_sb1_val = ();
334: @r_sb2_key = (); @r_sb2_val = ();
335: @r_sb3_key = (); @r_sb3_val = ();
336:
337: foreach $key (sort {hex($a) <=> hex($b)} keys(%to_sb)) {
338: $s = $to_sb{$key};
339:
340: $pos = $s % 94;
341: $ku = ($s - $pos)/94;
342: $v = $to_sb{$key} - $to_sb_min;
343: $h = sprintf("%x",$s);
344: #print "$ku:$pos = $h ($v) <= $key\n";
345: if (hex($key) <= $to_sb_max1) {
346: push(@r_sb1_key, $key);
347: push(@r_sb1_val, $h);
348: } elsif (hex($key) >= $to_sb_min2 && hex($key) <= $to_sb_max2) {
349: push(@r_sb2_key, $key);
350: push(@r_sb2_val, $h);
351: } else {
352: push(@r_sb3_key, $key);
353: push(@r_sb3_val, $h);
354: }
355: }
356:
357: push(@r_sb1_key, 0x00);
358: push(@r_sb1_val, 0x00);
359: push(@r_sb2_key, 0x00);
360: push(@r_sb2_val, 0x00);
361: push(@r_sb3_key, 0x00);
362: push(@r_sb3_val, 0x00);
363:
364:
365: print OUT "int mb_tbl_code2uni_sb1_min = $sb_min1;\n";
366: print OUT "int mb_tbl_code2uni_sb1_max = $sb_max1;\n";
367: print OUT "int mb_tbl_code2uni_sb2_min = $sb_min2;\n";
368: print OUT "int mb_tbl_code2uni_sb2_max = $sb_max2;\n";
369: print OUT "int mb_tbl_code2uni_sb3_min = $sb_min3;\n";
370: print OUT "int mb_tbl_code2uni_sb3_max = $sb_max3;\n\n";
371:
372: #print "SoftBank 1\n";
373:
374: print OUT "int mb_tbl_code2uni_sb1[] = {\n";
375: print OUT &show_code(@sb_v1);
376: print OUT "};\n\n";
377:
378: #print "SoftBank 2\n";
379:
380: print OUT "int mb_tbl_code2uni_sb2[] = {\n";
381: print OUT &show_code(@sb_v2);
382: print OUT "};\n\n";
383:
384: #print "SoftBank 3\n";
385:
386: print OUT "int mb_tbl_code2uni_sb3[] = {\n";
387: print OUT &show_code(@sb_v3);
388: print OUT "};\n\n";
389:
390: print OUT "int mb_tbl_uni_sb2code_min1 = $to_sb_min1;\n";
391: print OUT "int mb_tbl_uni_sb2code_max1 = $to_sb_max1;\n";
392: print OUT "int mb_tbl_uni_sb2code_min2 = $to_sb_min2;\n";
393: print OUT "int mb_tbl_uni_sb2code_max2 = $to_sb_max2;\n";
394: print OUT "int mb_tbl_uni_sb2code_min3 = $to_sb_min3;\n";
395: print OUT "int mb_tbl_uni_sb2code_max3 = $to_sb_max3;\n\n";
396:
397: #print "SB reverse 1\n";
398:
399: print OUT "int mb_tbl_uni_sb2code_key1[] = {\n";
400: print OUT &show_code(@r_sb1_key),"\n";
401: print OUT "};\n\n";
402: print OUT "int mb_tbl_uni_sb2code_val1[] = {\n";
403: print OUT &show_code(@r_sb1_val),"\n";
404: print OUT "};\n\n";
405:
406: #print "SB reverse 2\n";
407:
408: print OUT "int mb_tbl_uni_sb2code_key2[] = {\n";
409: print OUT &show_code(@r_sb2_key),"\n";
410: print OUT "};\n\n";
411: print OUT "int mb_tbl_uni_sb2code_val2[] = {\n";
412: print OUT &show_code(@r_sb2_val),"\n";
413: print OUT "};\n\n";
414:
415: #print "SB reverse 3\n";
416:
417: print OUT "int mb_tbl_uni_sb2code_key3[] = {\n";
418: print OUT &show_code(@r_sb3_key),"\n";
419: print OUT "};\n\n";
420: print OUT "int mb_tbl_uni_sb2code_val3[] = {\n";
421: print OUT &show_code(@r_sb3_val),"\n";
422: print OUT "};\n\n";
423:
424:
425: close(OUT);
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>