2
# script to generate Shift_JIS encoded Emoji to/from Unicode conversion table.
3
# Rui Hirokawa <hirokawa@php.net>
5
# usage: mktbl.pl EmojiSources.txt
7
# Unicoe;DoCoMo;KDDI;SoftBank
17
$fname = "emoji2uni.h";
18
open(OUT,">$fname") or die $!;
21
my @c = unpack("C*", pack("H4", $_[0]));
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);
27
$s = ($c[0] - 0x21)*94 + $c[1]-0x21;
35
for ($i=0; $i<=$#c; $i++) {#
37
@v = split(' ',$c[$i]);
40
print "$i $v[0] $v[1]\n";
55
if ($v[1] =~ /[\dA-F]+/) {
56
$code = &sjis2code($v[1]);
57
$docomo{$code} = $v[0];
58
$to_docomo{$v[0]} = $code;
60
if ($v[2] =~ /[\dA-F]+/) {
61
$code = &sjis2code($v[2]);
63
$to_kddi{$v[0]} = $code;
65
if ($v[3] =~ /[\dA-F]+/) {
66
$code = &sjis2code($v[3]);
67
$softbank{$code} = $v[0];
68
$to_sb{$v[0]} = $code;
76
$docomo_max = 10434+281;
79
foreach $key (sort {hex($a) <=> hex($b)} keys(%docomo)) {
83
$v = $key - $docomo_min;
84
#print "$ku:$pos - ". $v ."=> $docomo{$key}\n";
85
$docomo_v[$key-$docomo_min] = $docomo{$key};
88
$to_docomo_min = 10434;
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;
107
foreach $key (sort {hex($a) <=> hex($b)} keys(%to_docomo)) {
108
$s = $to_docomo{$key};
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);
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);
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";
137
print OUT "int mb_tbl_code2uni_docomo[] = {\n";
138
print OUT &show_code(@docomo_v);
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";
148
#print "DOCOMO reverse 1\n";
150
print OUT "int mb_tbl_uni_docomo2code_key1[] = {\n";
151
print OUT &show_code(@r_docomo1_key),"\n";
153
print OUT "int mb_tbl_uni_docomo2code_val1[] = {\n";
154
print OUT &show_code(@r_docomo1_val),"\n";
157
#print "DOCOMO reverse 2\n";
159
print OUT "int mb_tbl_uni_docomo2code_key2[] = {\n";
160
print OUT &show_code(@r_docomo2_key),"\n";
162
print OUT "int mb_tbl_uni_docomo2code_val2[] = {\n";
163
print OUT &show_code(@r_docomo2_val),"\n";
166
print "DOCOMO reverse 3\n";
168
print OUT "int mb_tbl_uni_docomo2code_key3[] = {\n";
169
print OUT &show_code(@r_docomo3_key),"\n";
171
print OUT "int mb_tbl_uni_docomo2code_val3[] = {\n";
172
print OUT &show_code(@r_docomo3_val),"\n";
175
#print "DOCOMO reverse end \n";
178
$kddi_max1 = 9400+264;
179
$kddi_min2 = 9400+564;
180
$kddi_max2 = 9400+939;
187
foreach $key (sort {hex($a) <=> hex($b)} keys(%kddi)) {
190
$ku = ($s - $pos)/94;
191
$v = $key - $kddi_min1;
192
$h = sprintf("%x",$key);
193
#print "$ku:$pos :: $v ($h) => $kddi{$key}\n";
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};
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;
210
@r_kddi1_key = (); @r_kddi1_val = ();
211
@r_kddi2_key = (); @r_kddi2_val = ();
212
@r_kddi3_key = (); @r_kddi3_val = ();
214
foreach $key (sort {hex($a) <=> hex($b)} keys(%to_kddi)) {
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);
229
push(@r_kddi3_key, $key);
230
push(@r_kddi3_val, $h);
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);
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";
248
print OUT "int mb_tbl_code2uni_kddi1[] = {\n";
249
print OUT &show_code(@kddi_v1);
254
print OUT "int mb_tbl_code2uni_kddi2[] = {\n";
255
print OUT &show_code(@kddi_v2);
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";
265
#print "KDDI reverse 1\n";
267
print OUT "int mb_tbl_uni_kddi2code_key1[] = {\n";
268
print OUT &show_code(@r_kddi1_key),"\n";
270
print OUT "int mb_tbl_uni_kddi2code_val1[] = {\n";
271
print OUT &show_code(@r_kddi1_val),"\n";
274
#print "KDDI reverse 1\n";
276
print OUT "int mb_tbl_uni_kddi2code_key2[] = {\n";
277
print OUT &show_code(@r_kddi2_key),"\n";
279
print OUT "int mb_tbl_uni_kddi2code_val2[] = {\n";
280
print OUT &show_code(@r_kddi2_val),"\n";
283
#print "KDDI reverse 3\n";
285
print OUT "int mb_tbl_uni_kddi2code_key3[] = {\n";
286
print OUT &show_code(@r_kddi3_key),"\n";
288
print OUT "int mb_tbl_uni_kddi2code_val3[] = {\n";
289
print OUT &show_code(@r_kddi3_val),"\n";
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;
307
foreach $key (sort {hex($a) <=> hex($b)} keys(%softbank)) {
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};
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;
333
@r_sb1_key = (); @r_sb1_val = ();
334
@r_sb2_key = (); @r_sb2_val = ();
335
@r_sb3_key = (); @r_sb3_val = ();
337
foreach $key (sort {hex($a) <=> hex($b)} keys(%to_sb)) {
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);
352
push(@r_sb3_key, $key);
353
push(@r_sb3_val, $h);
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);
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";
372
#print "SoftBank 1\n";
374
print OUT "int mb_tbl_code2uni_sb1[] = {\n";
375
print OUT &show_code(@sb_v1);
378
#print "SoftBank 2\n";
380
print OUT "int mb_tbl_code2uni_sb2[] = {\n";
381
print OUT &show_code(@sb_v2);
384
#print "SoftBank 3\n";
386
print OUT "int mb_tbl_code2uni_sb3[] = {\n";
387
print OUT &show_code(@sb_v3);
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";
397
#print "SB reverse 1\n";
399
print OUT "int mb_tbl_uni_sb2code_key1[] = {\n";
400
print OUT &show_code(@r_sb1_key),"\n";
402
print OUT "int mb_tbl_uni_sb2code_val1[] = {\n";
403
print OUT &show_code(@r_sb1_val),"\n";
406
#print "SB reverse 2\n";
408
print OUT "int mb_tbl_uni_sb2code_key2[] = {\n";
409
print OUT &show_code(@r_sb2_key),"\n";
411
print OUT "int mb_tbl_uni_sb2code_val2[] = {\n";
412
print OUT &show_code(@r_sb2_val),"\n";
415
#print "SB reverse 3\n";
417
print OUT "int mb_tbl_uni_sb2code_key3[] = {\n";
418
print OUT &show_code(@r_sb3_key),"\n";
420
print OUT "int mb_tbl_uni_sb2code_val3[] = {\n";
421
print OUT &show_code(@r_sb3_val),"\n";