Приветствую, в связи с тем что 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 = """;
// break;
// case 38:
// $character = "&";
// break;
// case 39:
// $character = "'";
// break;
// case 60:
// $character = "<";
// break;
// case 62:
// $character = ">";
// break;
// default:
// if($code < 32 || $code > 159)
// {
// $character = //("&#".strval($code).";");
// }
// break;
// }
// $escapeddata .= $character;
// }
// return $escapeddata;
// }
Гуру php нужна помощь.