Skip to content

Commit d8f1933

Browse files
committed
Making Str::ord() more robust
1 parent 309a721 commit d8f1933

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

src/common/Str.php

+30-16
Original file line numberDiff line numberDiff line change
@@ -100,28 +100,42 @@ public static function chr(int $code): string
100100

101101
public static function ord(string $ch): int
102102
{
103+
if ($ch === '') {
104+
throw new InvalidValueException($ch, "UTF-8 character");
105+
}
106+
103107
$ord0 = ord($ch[0]);
104-
if ($ord0 >= 0 && $ord0 <= 127) {
108+
if ($ord0 <= 127) {
105109
return $ord0;
106-
}
107-
$ord1 = ord($ch[1]);
108-
if ($ord0 >= 192 && $ord0 <= 223) {
110+
} elseif ($ord0 >= 192 && $ord0 <= 223 && strlen($ch) >= 2) {
111+
$ord1 = ord($ch[1]);
112+
109113
return ($ord0 - 192) * 64 + ($ord1 - 128);
110-
}
111-
$ord2 = ord($ch[2]);
112-
if ($ord0 >= 224 && $ord0 <= 239) {
114+
} elseif ($ord0 >= 224 && $ord0 <= 239 && strlen($ch) >= 3) {
115+
$ord1 = ord($ch[1]);
116+
$ord2 = ord($ch[2]);
117+
113118
return ($ord0 - 224) * 4096 + ($ord1 - 128) * 64 + ($ord2 - 128);
114-
}
115-
$ord3 = ord($ch[3]);
116-
if ($ord0 >= 240 && $ord0 <= 247) {
119+
} elseif ($ord0 >= 240 && $ord0 <= 247 && strlen($ch) >= 4) {
120+
$ord1 = ord($ch[1]);
121+
$ord2 = ord($ch[2]);
122+
$ord3 = ord($ch[3]);
123+
117124
return ($ord0 - 240) * 262144 + ($ord1 - 128) * 4096 + ($ord2 - 128) * 64 + ($ord3 - 128);
118-
}
119-
$ord4 = ord($ch[4]);
120-
if ($ord0 >= 248 && $ord0 <= 251) {
125+
} elseif ($ord0 >= 248 && $ord0 <= 251 && strlen($ch) >= 5) {
126+
$ord1 = ord($ch[1]);
127+
$ord2 = ord($ch[2]);
128+
$ord3 = ord($ch[3]);
129+
$ord4 = ord($ch[4]);
130+
121131
return ($ord0 - 248) * 16777216 + ($ord1 - 128) * 262144 + ($ord2 - 128) * 4096 + ($ord3 - 128) * 64 + ($ord4 - 128);
122-
}
123-
$ord5 = ord($ch[5]);
124-
if ($ord0 >= 252 && $ord0 <= 253) {
132+
} elseif ($ord0 >= 252 && $ord0 <= 253 && strlen($ch) >= 6) {
133+
$ord1 = ord($ch[1]);
134+
$ord2 = ord($ch[2]);
135+
$ord3 = ord($ch[3]);
136+
$ord4 = ord($ch[4]);
137+
$ord5 = ord($ch[5]);
138+
125139
return ($ord0 - 252) * 1073741824 + ($ord1 - 128) * 16777216 + ($ord2 - 128) * 262144 + ($ord3 - 128) * 4096 + ($ord4 - 128) * 64 + ($ord5 - 128);
126140
}
127141

0 commit comments

Comments
 (0)