Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Кириллица в ASCII и алфавитный список
Форумы портала PHP.SU » » Кодировки и все смежное » Кириллица в ASCII и алфавитный список

Страниц (1): [1]
 

1. Deonis - 24 Мая, 2011 - 23:29:32 - перейти к сообщению
В своё время делал алфавитный список с дальнейшим внесением в базу ASCII-кода букв. Выглядело это так:
PHP:
скопировать код в буфер обмена
  1. echo "<select>";
  2. for($i=65;$i<=90;$i++){
  3.         echo "<option value='".$i."'>".chr($i)." </option>";
  4. }
  5. echo "</select>";

Тут всё просто, т.к. использовались латинские буквы. Сейчас мне надо сделать тоже самое, но с кириллицей. Но сложность в том, что символы в выпадающем списке отображаются не правильно (сайт в кодировке UTF-8, в .htaccess строка "AddDefaultCharset UTF-8"). Найденный выход, кроме как индуским, не назовёшь:
PHP:
скопировать код в буфер обмена
  1. echo "<select>";
  2. for($i=192;$i<=223;$i++){
  3.         echo "<option value='".$i."'>".iconv("CP1251", "UTF-8",chr($i))."</option>";
  4. }
  5. echo "</select>";

Всегда старался избегать iconv(), но пока на ум только эта функция приходит. Если кто сталкивался с проблемой такой кодировки, то буду рад выслушать ваши варианты.
2. EuGen - 25 Мая, 2011 - 09:06:18 - перейти к сообщению
В UTF-8 номера кириллических букв будут другими. То, что делаете Вы - не решение, а обход проблемы (так как Вы переводите символы в однобайтовую кодировку).
В "чистом" виде задача некорректна - так как в ASCII 0<=ord(X)<=255 для любого X тогда как в UTF-8 номера кириллических букв будут больше 1000.
Предлагаю подумать в сторону изменения логики. Например, пробегать в цикле по буквам, а не по номерам. Для UTF-8 стандартный ord работать не будет (он работает с ASCII); так что можете взять любой пример с php.net, например:
PHP:
скопировать код в буфер обмена
  1.  
  2. function ordUTF8($c, $index = 0, &$bytes = null)
  3. {
  4.   $len = strlen($c);
  5.   $bytes = 0;
  6.  
  7.   if ($index >= $len)
  8.   {
  9.     return false;
  10.   }
  11.   $h = ord($c{$index});
  12.   if ($h <= 0x7F)
  13.   {
  14.     $bytes = 1;
  15.     return $h;
  16.   }
  17.   else if ($h < 0xC2)
  18.   {
  19.     return false;
  20.   }
  21.   else if ($h <= 0xDF && $index < $len - 1)
  22.   {
  23.     $bytes = 2;
  24.     return ($h & 0x1F) <<  6 | (ord($c{$index + 1}) & 0x3F);
  25.   }
  26.   else if ($h <= 0xEF && $index < $len - 2)
  27.   {
  28.     $bytes = 3;
  29.     return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6
  30.                              | (ord($c{$index + 2}) & 0x3F);
  31.   }          
  32.   else if ($h <= 0xF4 && $index < $len - 3)
  33.   {
  34.     $bytes = 4;
  35.     return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12
  36.                              | (ord($c{$index + 2}) & 0x3F) << 6
  37.                              | (ord($c{$index + 3}) & 0x3F);
  38.   }
  39.   else
  40.     return false;
  41. }
  42.  

http://php.net/manual/en/function.ord.php

 

Powered by ExBB FM 1.0 RC1