| 1 | <?php |
|---|
| 2 | function seems_utf8(&$str) { |
|---|
| 3 | $length = strlen($str); |
|---|
| 4 | for ($i=0; $i < $length; $i++) { |
|---|
| 5 | $c = ord($str[$i]); |
|---|
| 6 | if ($c < 0x80) $n = 0; # 0bbbbbbb |
|---|
| 7 | elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb |
|---|
| 8 | elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb |
|---|
| 9 | elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb |
|---|
| 10 | elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb |
|---|
| 11 | elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b |
|---|
| 12 | else return false; # Does not match any model |
|---|
| 13 | for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ? |
|---|
| 14 | if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80)) |
|---|
| 15 | return false; |
|---|
| 16 | } |
|---|
| 17 | } |
|---|
| 18 | return true; |
|---|
| 19 | } |
|---|
| 20 | function bool_to_string($bool) { |
|---|
| 21 | if($bool===true) { |
|---|
| 22 | return "true"; |
|---|
| 23 | } |
|---|
| 24 | else if($bool===false) { |
|---|
| 25 | return "false"; |
|---|
| 26 | } |
|---|
| 27 | else if($bool===null) { |
|---|
| 28 | return "null"; |
|---|
| 29 | } |
|---|
| 30 | else { |
|---|
| 31 | return "non-boolean"; |
|---|
| 32 | } |
|---|
| 33 | } |
|---|
| 34 | header("Content-Type: text/plain; charset=UTF-8"); |
|---|
| 35 | header("X-Content-Type-Options: nosniff"); |
|---|
| 36 | $string1="\x24 \xC2\xA2 \xE2\x82\xAC \xF4\x8A\xAF\x8D"; /* U+0024 U+00A2 U+20AC U+10ABCD in UTF-8 */ |
|---|
| 37 | $string2="\x19\x90 \x2F\x66 \x00\x4E \x8A\x62 \x41\xD8\x79\xDF \x00\x52 \x02\x30"; /* U+9019 U+662F U+4E00 U+628A U+20779 U+5200 U+3002 in UTF-16 */ |
|---|
| 38 | echo bool_to_string(seems_utf8($string1))."\r\n".bool_to_string(seems_utf8($string2)); |
|---|
| 39 | ?> |
|---|