PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Deonis
Отправлено: 24 Мая, 2011 - 23:29:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




В своё время делал алфавитный список с дальнейшим внесением в базу 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(), но пока на ум только эта функция приходит. Если кто сталкивался с проблемой такой кодировки, то буду рад выслушать ваши варианты.
 
 Top
EuGen Администратор
Отправлено: 25 Мая, 2011 - 09:06:18
Post Id


Профессионал


Покинул форум
Сообщений всего: 9096
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В 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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB