Класс для определения ASCII кода UTF символа и наоборот
- class UnicChar
- {
- //Получаем ASCII код UTF символа
- public function UnOrd($char, $index = 0)
- {
- $octet1 = ord($char[$index]);
- if ($octet1 >> 7 == 0x00)
- return $octet1;
- elseif ($octet1 >> 6 != 0x02)
- {
- if (!isset($char[++$index]))
- return false;
- $octet2 = ord($char[$index]);
- if ($octet2 >> 6 != 0x02)
- {
- --$index;
- return false;
- }
- $octet2 &= 0x3F;
- if ($octet1 >> 5 == 0x06)
- {
- $result = ($octet1 & 0x1F) << 6 | $octet2;
- if (0x80 < $result)
- return $result;
- }
- else
- {
- if (!isset($char[++$index]))
- return false;
- $octet3 = ord($char[$index]);
- if ($octet3 >> 6 != 0x02)
- {
- --$index;
- return false;
- }
- $octet3 &= 0x3F;
- if ($octet1 >> 4 == 0x0E)
- {
- $result = ($octet1 & 0x0F) << 12 | $octet2 << 6 | $octet3;
- if (0x800 < $result && !(0xD7FF < $result && $result < 0xF900) && $result != 0xFEFF)
- return $result;
- }
- else
- {
- if (!isset($char[++$index]))
- return false;
- $octet4 = ord($char[$index]);
- if ($octet4 >> 6 != 0x02)
- {
- --$index;
- return false;
- }
- $octet4 &= 0x3F;
- if ($octet1 >> 3 == 0x1E)
- {
- $result = ($octet1 & 0x07) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4;
- if (0x10000 < $result && $result < 0xF0000)
- return $result;
- }
- }
- }
- return false;
- }
- }
- // Возвращает UTF-8 символ по его коду.
- public function getChar($codePoint)
- {
- if ($codePoint < 0x80){
- return chr($codePoint);
- } elseif ($codePoint < 0x800) {
- return chr(0xC0 | $codePoint >> 6) . chr(0x80 | $codePoint & 0x3F);
- } elseif ($codePoint < 0x10000) {
- return chr(0xE0 | $codePoint >> 12) . chr(
- 0x80 | $codePoint >> 6 & 0x3F) . chr(0x80 | $codePoint & 0x3F);
- } elseif ($codePoint < 0x110000) {
- return chr(0xF0 | $codePoint >> 18) . chr(
- 0x80 | $codePoint >> 12 & 0x3F) . chr(0x80 | $codePoint >> 6 & 0x3F) . chr(
- 0x80 | $codePoint & 0x3F);
- } else {
- return false;
- }
- }
- }
- echo UnicChar::UnOrd('я');
- // Вернет 1103
- echo UnicChar::getChar(1103);
- // вернет "я"
Зы: стыбзено с хабра, поэтому за код не ругать.