simpleXML - определить кодировку

Tayson

Новичок
simpleXML - определить кодировку

Парсю XML через функцию:
function parser_xml ($strxml) {
$xml = simplexml_load_string($strxml);
$new_array=array();
if (is_object($xml)) {
echo "\n Ob'ekt est \n";
foreach ($xml->children() as $key=>$response) {
if ($key!="s" || $key!="display") {
echo "Massiv[$key]=".$response."\n";
}
if ($key=="display") {

foreach ($response->children() as $key2 => $response2) { // перебираем доп массив
echo "Massiv[$key2]=".$response2."\n";
$new_array[$key2]=(string)$response2;
}
}else {
$new_array[$key]=(string)$response;
}
}
}else {
echo "Obekt nulevoy. \n";
$new_array=array("result" => "-99");
}
$return_value=$new_array;
return $return_value;

}

Файл XML в логе выглядит так:

$strxml=<?xml version="1.0" encoding="windows-1251"?><res><ch>361</ch><result>178</result><time>2010-06-12 08:49:09</time><s>0A75</s><display><pay_amount>114.21</pay><text>
Укртелеком, Луганск, </text></display></res>

После Распарсивания получаем в логе:

Ob'ekt est
Massiv[ch]=361
Massiv[result]=178
Massiv[time]=2010-06-12 08:49:09
Massiv=0A75
Massiv[display]=
Massiv[pay]=114.21
Massiv[text]=
Р_РєС_С'РчР>РчРєР_Р_, Р>С_Р_Р°Р_С_Рє,

В результате элемент Massiv[text] в другой кодировке. Предположительно UTF -8 , хотя обратное перекодирование через online сервисы начальную строку не дают. Перепробовал около 10 функций которые нашел на форуме и в инете, но так и не смог получить исходную строку. Вообщем мозги кипели кипели и сварились. :( . Прошу помощи общества профессионалов. Как получить средствами PHP из Р_РєС_С'РчР>РчРєР_Р_, Р>С_Р_Р°Р_С_Рє --> Укртелеком, Луганск
 

A1x

Новичок
simpleXML всегда на выходе выдает utf-8 независимо от исходной кодировки документа

Перепробовал около 10 функций
какие функции и как именно пробовал?
 

Tayson

Новичок
2A1x
Пробовал iconv,
function utf8_to_cp1251($utf8) {

$windows1251 = "";
$chars = preg_split("//",$utf8);

for ($i=1; $i<count($chars)-1; $i++) {
$prefix = ord($chars[$i]);
$suffix = ord($chars[$i+1]);

if ($prefix==215) {
$windows1251 .= chr($suffix+80);
$i++;
} elseif ($prefix==214) {
$windows1251 .= chr($suffix+16);
$i++;
} else {
$windows1251 .= $chars[$i];
}
}

return $windows1251;
}

function Utf8Win($str,$type="w") {
static $conv='';

if (!is_array($conv)) {
$conv = array();

for($x=128;$x<=143;$x++) {
$conv['u'][]=chr(209).chr($x);
$conv['w'][]=chr($x+112);

}

for($x=144;$x<=191;$x++) {
$conv['u'][]=chr(208).chr($x);
$conv['w'][]=chr($x+48);
}

$conv['u'][]=chr(208).chr(129);
$conv['w'][]=chr(168);
$conv['u'][]=chr(209).chr(145);
$conv['w'][]=chr(184);
$conv['u'][]=chr(208).chr(135);
$conv['w'][]=chr(175);
$conv['u'][]=chr(209).chr(151);
$conv['w'][]=chr(191);
$conv['u'][]=chr(208).chr(134);
$conv['w'][]=chr(178);
$conv['u'][]=chr(209).chr(150);
$conv['w'][]=chr(179);
$conv['u'][]=chr(210).chr(144);
$conv['w'][]=chr(165);
$conv['u'][]=chr(210).chr(145);
$conv['w'][]=chr(180);
$conv['u'][]=chr(208).chr(132);
$conv['w'][]=chr(170);
$conv['u'][]=chr(209).chr(148);
$conv['w'][]=chr(186);
$conv['u'][]=chr(226).chr(132).chr(150);
$conv['w'][]=chr(185);
}

if ($type == 'w') {
return str_replace($conv['u'],$conv['w'],$str);
} elseif ($type == 'u') {
return str_replace($conv['w'], $conv['u'],$str);
} else {
return $str;
}
}

1.
function utf8_win($s)
2.
{
3.
$s=str_replace("xD0xB0","а",$s); $s=str_replace("xD0x90","А",$s);
4.
$s=str_replace("xD0xB1","б",$s); $s=str_replace("xD0x91","Б",$s);
5.
$s=str_replace("xD0xB2","в",$s); $s=str_replace("xD0x92","В",$s);
6.
$s=str_replace("xD0xB3","г",$s); $s=str_replace("xD0x93","Г",$s);
7.
$s=str_replace("xD0xB4","д",$s); $s=str_replace("xD0x94","Д",$s);
8.
$s=str_replace("xD0xB5","е",$s); $s=str_replace("xD0x95","Е",$s);
9.
$s=str_replace("xD1x91","ё",$s); $s=str_replace("xD0x81","Ё",$s);
10.
$s=str_replace("xD0xB6","ж",$s); $s=str_replace("xD0x96","Ж",$s);
11.
$s=str_replace("xD0xB7","з",$s); $s=str_replace("xD0x97","З",$s);
12.
$s=str_replace("xD0xB8","и",$s); $s=str_replace("xD0x98","И",$s);
13.
$s=str_replace("xD0xB9","й",$s); $s=str_replace("xD0x99","Й",$s);
14.
$s=str_replace("xD0xBA","к",$s); $s=str_replace("xD0x9A","К",$s);
15.
$s=str_replace("xD0xBB","л",$s); $s=str_replace("xD0x9B","Л",$s);
16.
$s=str_replace("xD0xBC","м",$s); $s=str_replace("xD0x9C","М",$s);
17.
$s=str_replace("xD0xBD","н",$s); $s=str_replace("xD0x9D","Н",$s);
18.
$s=str_replace("xD0xBE","о",$s); $s=str_replace("xD0x9E","О",$s);
19.
$s=str_replace("xD0xBF","п",$s); $s=str_replace("xD0x9F","П",$s);
20.
$s=str_replace("xD1x80","р",$s); $s=str_replace("xD0xA0","Р",$s);
21.
$s=str_replace("xD1x81","с",$s); $s=str_replace("xD0xA1","С",$s);
22.
$s=str_replace("xD1x82","т",$s); $s=str_replace("xD0xA2","Т",$s);
23.
$s=str_replace("xD1x83","у",$s); $s=str_replace("xD0xA3","У",$s);
24.
$s=str_replace("xD1x84","ф",$s); $s=str_replace("xD0xA4","Ф",$s);
25.
$s=str_replace("xD1x85","х",$s); $s=str_replace("xD0xA5","Х",$s);
26.
$s=str_replace("xD1x86","ц",$s); $s=str_replace("xD0xA6","Ц",$s);
27.
$s=str_replace("xD1x87","ч",$s); $s=str_replace("xD0xA7","Ч",$s);
28.
$s=str_replace("xD1x88","ш",$s); $s=str_replace("xD0xA8","Ш",$s);
29.
$s=str_replace("xD1x89","щ",$s); $s=str_replace("xD0xA9","Щ",$s);
30.
$s=str_replace("xD1x8A","ъ",$s); $s=str_replace("xD0xAA","Ъ",$s);
31.
$s=str_replace("xD1x8B","ы",$s); $s=str_replace("xD0xAB","Ы",$s);
32.
$s=str_replace("xD1x8C","ь",$s); $s=str_replace("xD0xAC","Ь",$s);
33.
$s=str_replace("xD1x8D","э",$s); $s=str_replace("xD0xAD","Э",$s);
34.
$s=str_replace("xD1x8E","ю",$s); $s=str_replace("xD0xAE","Ю",$s);
35.
$s=str_replace("xD1x8F","я",$s); $s=str_replace("xD0xAF","Я",$s);
36.
return $s;
37.
}
пробовал эти и еще несколько
 

mity

Новичок
Tayson вы какой-то ерундой занимаетесь
есть такая встроенная в php функция iconv()
$TextWin=iconv("UTF-8","WINDOWS-1251",$TextUtf);
Которая присутствует практически на всех хостингах
а изобретать велосипед совсем не нужно.

Если Вы считаете что у Вас все функции криво конвертируют из utf-8 в win, то и выводите в utf-8.
PHP:
<?php
header("Content-Type: content=text/html; charset=utf-8");   
?><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
$xml = simplexml_load_string($strxml);
$new_array=array();
if (is_object($xml)) {
  echo "\n Ob'ekt est \n";
  foreach ($xml->children() as $key=>$response) {
    if ($key!="s" || $key!="display") {
       echo "Massiv[$key]=".$response."\n";
     }
  if ($key=="display") { 
    foreach ($response->children() as $key2 => $response2) { // перебираем доп массив
      echo "Massiv[$key2]=".$response2."\n";
      $new_array[$key2]=(string)$response2; 
    }
  }else {
   $new_array[$key]=(string)$response; 
  }
  }
}else {
  echo "Obekt nulevoy. \n";
  $new_array=array("result" => "-99");
  }
?>
</body>
</html>
 

AmdY

Пью пиво
Команда форума
недавно кучу времени потратил, искал почему тормозит сайт, страницы по 20 сек генерятся. там php4 и править приходилось на сервере без xdebug. оказалось, что тормозила как раз такая вот самопальная функция. юзайте только iconv.
 

Tayson

Новичок
iconv - с нее первой начал пробовать....

2 mity
Попробуй сам: вот строка до парсинга:
Укртелеком, Луганск

Вот строка после парсинга:
Р_РєС_С'РчР>РчРєР_Р_, Р>С_Р_Р°Р_С_Рє

Количество символов различно. Получить из второй первую - НЕМОГУ.
 

AmdY

Пью пиво
Команда форума
всё прекрасно получается, ты видимо не учитываешь либо в какой кодировке у тебя файл с кодом, либо в какой отдаёт сервер.
проверь по очереди
1. кодировку xml файла (encoding="windows-1251" ещё не о чём не говорит, все врут).
2. кодировку файлов с исходником
3. на основании первых правильно ли делаешь iconv
4. кодировка в какой отдаёт сервер и в какой у тебя она в браузере
 

Mols

Новичок
Tayson
Я пробовал. У меня работает.

-~{}~ 14.06.10 11:56:

З.Ы.
В документации или не увидел или этого нет.
Но в результате работы simplexml_load_string всегда строки в ЮТФ-8. Вне зависимости от того в какой кодировке пришёл XML.
Что в общем и не плохо)
 

Tayson

Новичок
2AmdY & 2Mols
Дык файла нет. Принимаю через сокеты ХМЛ . Заголовок : <?xml version="1.0" encoding="windows-1251"?>.

iconv делаю так:

echo iconv("UTF-8", "Windows-1251", "Р_РєС_С'РчР>РчРєР_Р_, .")."\n";

Покажите плиз как у Вас отработал iconv ??
 

Mols

Новичок
Эм.
Ну попробуйте так.
PHP:
 echo "Massiv[$key2]=".iconv('utf-8', 'cp1251',$response2)."\n";
-~{}~ 14.06.10 12:37:

З.Ы.
Да простят меня местные стражи порядка)))
 

mity

Новичок
Tayson если у Вас всё так плохо, то выложите сюда результат вывода из такого фрагмента кода
PHP:
echo urlencode($strxml)."\n";
echo "=======================================\n";
$xml=simplexml_load_string($strxml);
$Buffer="";
$new_array=array();
if (is_object($xml)) {
$Buffer.= "\n Ob'ekt est \n";
foreach ($xml->children() as $key=>$response) {
if ($key!="s" || $key!="display") {
$Buffer.= "Massiv[$key]=".$response."\n";
}
if ($key=="display") { 

foreach ($response->children() as $key2 => $response2) { // перебираем доп массив
$Buffer.= "Massiv[$key2]=".$response2."\n";
$new_array[$key2]=(string)$response2; 
}
}else {
$new_array[$key]=(string)$response; 
}
}
}else {
$Buffer.= "Obekt nulevoy. \n";
$new_array=array("result" => "-99");
}
echo urlencode($Buffer);
$return_value=$new_array;
return $return_value;

}
 

Tayson

Новичок
все раздуплился ! заработало!
Когда я выводил так:
echo iconv("UTF-8", "windows-1251", "Р_РєС_С'РчР>РчРєР_Р_, .")."\n";
нифига не работало.
А когда вывел через переменную - все гуд!
Всем спасибо. Тема закрыта.
 
Сверху