LINUX.ORG.RU

Нужна помощь. php, charset, etc.....


0

0

Приветствую, в связи с тем что php я знаю не гуд, прошу помощь у сообщества.
Суть просблемы описана на форуме egroupware.

http://forum.egroupware.org/viewtopic.php?t=29438

Кому лень идти по ссылк.....




Итак - я смог выяснить, что eGW пытается отослать все символы в пределах [0..31, 160..255] - как числовые XML entities. Но: 
* Без учета кодировки (и без указания оной в заголовке) 
* Без учета mbstring 
Kontact это понимает, но воспринимает переданные entities как unicode. 

Задача - преобразовывать все символы > 128 в XML-entities в Unicode (USC-2). 

<code> 
/usr/share/egroupware/phpgwapi/inc/xml_functions.inc.php: 
... 
function xmlrpc_encode_entitites($data) 
{ 
$convmap = array(0, 0x1F, 0, 0xFFFF, 0x80, 0xFFFF, 0, 0xFFFF); 
$incs = $GLOBALS['egw']->translation->system_charset; // input charset 
$outcs = "UTF-16LE"; // output charset (LE - to prevent BOW) 
$length = mb_strlen($data, $incs); 
$escapeddata = ""; 
for($position = 0; $position < $length; $position++) 
{ 
$character = mb_substr($data, $position, 1, $incs); 
$code = Ord($character); 
if($code < 32) 
$character = ("&#".strval($code).";"); 
else if ($code >= 128) # international -> unicode -> digit entity 
$character = iconv($outcs, "ascii", mb_encode_numericentity(iconv($incs, $outcs, $character), $convmap, $outcs)); 
$escapeddata .= $character; // special chars (<>&"') already converted in database 
} 
return $escapeddata; 
} 
</code> 

Недостатки: 
* работает очень медленно (идет 4 переконвертирования одной и той же строки) 
* там какая-то ерунда со спец-символами [<>&"'], не помню уже... На днях буду разворачивать eGW в боевую позицию - продолжу. 

Достоинства: 
* работает :-) 

Примечания: 
* на Задачах не проверял, но, судя по всему - там конвертирование идет совсем другим путем.




А вот как в оригинальном файле xml_functions.inc.php

 //function xmlrpc_encode_entitites($data)

        //      $length = strlen($data);
        //      $escapeddata = "";
        //      for($position = 0; $position < $length; $position++)
        //      {
        //              $character = substr($data, $position, 1);
        //              $code = Ord($character);
        //              switch($code)
        //              {
        //                      case 34:
        //                              $character = "&quot;";
        //                              break;
        //                      case 38:
        //                              $character = "&amp;";
        //                              break;
        //                      case 39:
//                                      $character = "&apos;";
//                                      break;
//                              case 60:
//                                      $character = "&lt;";
//                                      break;
//                              case 62:
//                                      $character = "&gt;";
//                                      break;
//                              default:
//                                      if($code < 32 || $code > 159)
//                                      {
//                                              $character =          //("&#".strval($code).";");
//                                      }
//                                      break;
//                      }
//                      $escapeddata .= $character;
//              }
//              return $escapeddata;
//      }





Гуру php нужна помощь.

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.