Класс для определения ASCII кода UTF символа и наоборот

  1. class UnicChar
  2. {
  3.   //Получаем ASCII код UTF символа
  4.   public function UnOrd($char, $index =  0)
  5.   {
  6.     $octet1 = ord($char[$index]);
  7.     if ($octet1 >> 7 == 0x00)
  8.       return $octet1;
  9.     elseif ($octet1 >> 6 != 0x02)
  10.     {
  11.       if (!isset($char[++$index]))
  12.         return false;
  13.       $octet2 = ord($char[$index]);
  14.       if ($octet2 >> 6 != 0x02)
  15.       {
  16.         --$index;
  17.         return false;
  18.       }
  19.       $octet2 &= 0x3F;
  20.       if ($octet1 >> 5 == 0x06)
  21.       {
  22.         $result = ($octet1 & 0x1F) << 6 | $octet2;
  23.         if (0x80 < $result)
  24.           return $result;
  25.       }
  26.       else
  27.       {
  28.         if (!isset($char[++$index]))
  29.           return false;
  30.         $octet3 = ord($char[$index]);
  31.         if ($octet3 >> 6 != 0x02)
  32.         {
  33.           --$index;
  34.           return false;
  35.         }
  36.         $octet3 &= 0x3F;
  37.         if ($octet1 >> 4 == 0x0E)
  38.         {
  39.           $result = ($octet1 & 0x0F) << 12 | $octet2 << 6 | $octet3;
  40.           if (0x800 < $result && !(0xD7FF < $result && $result < 0xF900) && $result != 0xFEFF)
  41.             return $result;
  42.         }
  43.         else
  44.         {
  45.           if (!isset($char[++$index]))
  46.             return false;
  47.           $octet4 = ord($char[$index]);
  48.           if ($octet4 >> 6 != 0x02)
  49.           {
  50.             --$index;
  51.             return false;
  52.           }
  53.           $octet4 &= 0x3F;
  54.           if ($octet1 >> 3 == 0x1E)
  55.           {
  56.             $result = ($octet1 & 0x07) << 18 | $octet2 << 12 | $octet3 << 6 | $octet4;
  57.             if (0x10000 < $result && $result < 0xF0000)
  58.               return $result;
  59.           }
  60.         }
  61.       }
  62.      return false;
  63.     }
  64.   }
  65.  
  66.  
  67. // Возвращает UTF-8 символ по его коду.
  68.   public function getChar($codePoint)
  69.   {
  70.     if ($codePoint < 0x80){
  71.     return chr($codePoint);
  72.     } elseif ($codePoint < 0x800) {
  73.     return chr(0xC0 | $codePoint >> 6) . chr(0x80 | $codePoint & 0x3F);
  74.     } elseif ($codePoint < 0x10000) {
  75.     return chr(0xE0 | $codePoint >> 12) . chr(
  76.     0x80 | $codePoint >> 6 & 0x3F) . chr(0x80 | $codePoint & 0x3F);
  77.     } elseif ($codePoint < 0x110000) {
  78.     return chr(0xF0 | $codePoint >> 18) . chr(
  79.     0x80 | $codePoint >> 12 & 0x3F) . chr(0x80 | $codePoint >> 6 & 0x3F) . chr(
  80.     0x80 | $codePoint & 0x3F);
  81.     } else {
  82.     return false;
  83.     }
  84.   }
  85. }
  1. echo UnicChar::UnOrd('я');
  2. // Вернет 1103
  3. echo UnicChar::getChar(1103);
  4. // вернет "я"
Может кому и пригодиться.
Зы: стыбзено с хабра, поэтому за код не ругать.

Реклама

Мы в соцсетях

tw tg yt gt