Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: оптимизация функции utf8-win1251 и win1251-utf8
 
 автор: aetern   (26.02.2010 в 17:14)   письмо автору
 
 

есть довольно простая функция:
<?php
$chars 
= array(
        
'194171'=>chr(171),
        
'194187'=>chr(187),
        
'194176'=>chr(176),
  
# upper case letters
 
'208144' => chr(192), '208145' => chr(193), '208146' => chr(194),
  
'208147' => chr(195), '208148' => chr(196), '208149' => chr(197),
  
'208129' => chr(168), '208150' => chr(198), '208151' => chr(199),
  
'208152' => chr(200), '208153' => chr(201), '208154' => chr(202),
  
'208155' => chr(203), '208156' => chr(204), '208157' => chr(205),
  
'208158' => chr(206), '208159' => chr(207), '208160' => chr(208),
  
'208161' => chr(209), '208162' => chr(210), '208163' => chr(211),
  
'208164' => chr(212), '208165' => chr(213), '208166' => chr(214),
  
'208167' => chr(215), '208168' => chr(216), '208169' => chr(217),
  
'208170' => chr(218), '208171' => chr(219), '208172' => chr(220),
  
'208173' => chr(221), '208174' => chr(222), '208175' => chr(223),
  
# lower case letters
 
'208176' => chr(224), '208177' => chr(225), '208178' => chr(226),
  
'208179' => chr(227), '208180' => chr(228), '208181' => chr(229),
  
'209145' => chr(184), '208182' => chr(230), '208183' => chr(231),
  
'208184' => chr(232), '208185' => chr(233), '208186' => chr(234),
  
'208187' => chr(235), '208188' => chr(236), '208189' => chr(237),
  
'208190' => chr(238), '208191' => chr(239), '209128' => chr(240),
  
'209129' => chr(241), '209130' => chr(242), '209131' => chr(243),
  
'209132' => chr(244), '209133' => chr(245), '209134' => chr(246),
  
'209135' => chr(247), '209136' => chr(248), '209137' => chr(249),
  
'209138' => chr(250), '209139' => chr(251), '209140' => chr(252),
  
'209141' => chr(253), '209142' => chr(254), '209143' => chr(255)
);

function 
utf8_to_win1251($str)
{
global 
$chars;
$len strlen($str);
$temp '';

for(
$i=0;$i<$len;$i++) {
$chcode ord($str[$i]);
while(
$i<$len-&& $chcode!=208 && $chcode!=209) { 
$temp.=$str[$i];
$chcode ord($str[++$i]);
}
if(
$i<$len-1) {
$key = (string) $chcode.ord($str[++$i]);
if(isset(
$chars[$key])) { 
$temp.= $chars[$key];
} else 
$temp.=$str[$i];
} else 
$temp.=$str[$i];
}
return(
$temp);
}

function 
win2151_to_utf8($str)
{
global 
$chars;
$chars array_flip($chars);
$len strlen($str);
$temp '';

for(
$i=0;$i<$len;$i++) {
if(isset(
$chars[$str[$i]])) {
$key = (string) $chars[$str[$i]];
$chs chr($key[0].$key[1].$key[2]).chr($key[3].$key[4].$key[5]);
$temp.=$chs;
} else 
$temp.=$str[$i];
}
$chars array_flip($chars);
return(
$temp);
}
?>


Вопрос: как оптимизировать закладку в массив?

Почему не работает такой вариант:
for($i=192; $i<240; $i++){$chars[207952+$i]= chr($i);}
for($i=240; $i<256; $i++){$chars[208888+$i]= chr($i);}


или
такой

for($i=33; $i<256; $i++){$chars[208896+$i]= chr($i);}

  Ответить  
 
 автор: sim5   (26.02.2010 в 17:47)   письмо автору
 
   для: aetern   (26.02.2010 в 17:14)
 

А чем iconv вас не устраивает?

  Ответить  
 
 автор: aetern   (26.02.2010 в 18:14)   письмо автору
 
   для: sim5   (26.02.2010 в 17:47)
 

дело больше не в функции, а в том, почему не работают предложенные мною варианты оптимизации.

  Ответить  
 
 автор: sim5   (26.02.2010 в 18:38)   письмо автору
 
   для: aetern   (26.02.2010 в 18:14)
 

Не вдаваясь, могу сразу сказать - strlen не работает с мультибайтной строкой, для этого существует mb_strlen. Возможно подобные косяки у вас и еще есть.
К чему заниматься этим, если существует готовая функция? Или это просто задача для мозгов?

  Ответить  
 
 автор: aetern   (27.02.2010 в 21:10)   письмо автору
 
   для: sim5   (26.02.2010 в 18:38)
 

Да, просто зацепило то, что не получилось сходу оптимизировать.
Функцию я нашел на одном форуме, где ее автор уверял, что она работает быстрее и надежнее предложенного вами существующего аналога.

  Ответить  
 
 автор: sim5   (28.02.2010 в 06:19)   письмо автору
 
   для: aetern   (27.02.2010 в 21:10)
 

function utf8_to_win1251($str) {
global $chars;
$len = strlen($str);

Как же она вообще может работать, функция эта, если использует strlen, получая UTF (судя о ее назначении по названию) на входе?

  Ответить  
 
 автор: Trianon   (28.02.2010 в 08:24)   письмо автору
 
   для: sim5   (28.02.2010 в 06:19)
 

это понятно. Байтовую длину берет, с байтами и работает.

Медленно и неравильно.
Медленно - потому что начинка на php.
Неправильно - потому что кроме русской кириллицы она не преобразует ничего.
А ведь в 1251 около четырех языков, помимо аглицкого.

  Ответить  
 
 автор: sim5   (28.02.2010 в 09:17)   письмо автору
 
   для: Trianon   (28.02.2010 в 08:24)
 

Вывод - код надо не оптимизировать, его надо переписывать, либо выбросить. Я склоняюсь к последнему. ;-)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования