-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnyAscii.php
43 lines (39 loc) · 1.09 KB
/
AnyAscii.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
class AnyAscii {
private static $blocks = array();
public static function transliterate($utf8) {
$result = '';
$i = 0;
$len = strlen($utf8);
while ($i < $len) {
$cp = self::utf8NextCodepoint($utf8, $i);
if ($cp < 0x80) {
$result .= chr($cp);
continue;
}
$blockNum = $cp >> 8;
if (!isset(self::$blocks[$blockNum])) {
$fileName = sprintf('%s/_data/_%03x.php', __DIR__, $blockNum);
$block = file_exists($fileName) ? require $fileName : array();
self::$blocks[$blockNum] = $block;
} else {
$block = self::$blocks[$blockNum];
}
$lo = ($cp & 0xff);
if (isset($block[$lo])) {
$result .= $block[$lo];
}
}
return $result;
}
private static function utf8NextCodepoint($s, &$i) {
$b1 = ord($s[$i++]);
if ($b1 < 0x80) return $b1;
$b2 = ord($s[$i++]);
if ($b1 < 0xe0) return (($b1 & 0x1f) << 6) | ($b2 & 0x3f);
$b3 = ord($s[$i++]);
if ($b1 < 0xf0) return (($b1 & 0xf) << 12) | (($b2 & 0x3f) << 6) | ($b3 & 0x3f);
$b4 = ord($s[$i++]);
return (($b1 & 0x7) << 18) | (($b2 & 0x3f) << 12) | (($b3 & 0x3f) << 6) | ($b4 & 0x3f);
}
}