2012-05-18 2 views
0

Я разбираю xml-файл с url (в коде ниже), используя file_get_contents() и simpleXML, чтобы вставить данные в таблицу, я сделал хорошо, но у меня проблема с кодирование (русские слова) я получаю это ->Р§РμСЂРЅРѕРіРѕСЂРёСЏ; для кодировки файла и базы данных установлено значение utf-8;xml to php and parse encoding error

require_once 'mysql_connect.php'; 
/** 
* 
* 
*/ 
error_reporting(E_ALL); 
$sql = "CREATE TABLE IF NOT EXISTS `db_countries` (
    `id` int(11) unsigned NOT NULL auto_increment, 
    `countrykey` varchar(255) NOT NULL default '', 
    `countryname` varchar(255) NOT NULL default '', 
    `countrynamelat` varchar(500) NOT NULL default '', 
    PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8"; 

mysql_query($sql); 

$data = file_get_contents("http://www2.turtess-online.com.ua/export/dictionary/countries/"); 
$xml = new SimpleXMLElement($data); 

echo $xml->body->dictionary->element["countryName"]; 

foreach ($xml->body->dictionary->element as $element) { 
    $countryname = mysql_real_escape_string($element["countryName"]); 
    $countrynamelat = mysql_real_escape_string($element["countryNameLat"]); 
    $countrykey  = $element["countryKey"]; 

    if ($countrykey) { 
     $q  = $insert = 'INSERT INTO db_countries (countrykey, countryname, countrynamelat) VALUES ("' . $countrykey . '", "' . $countryname . '", "' . $countrynamelat . '")'; 
     mysql_query($q); 
    } else { 
     echo "not valid key of country"; 
    } 
} 
+0

Исходная кодировка - это 'windows-1251', как показано в браузере-источнике, ваш db -' utf-8' ... хотел бы запустить соответствующее преобразование сначала перед вставкой xml-данных в db. –

ответ

1

Убедитесь, что вы также вставляете содержимое Юникода, кодировка базы данных не выполняет «автоматическое» преобразование.

В качестве альтернативы, я хотел бы предложить utf8_encode($countryname) как в:

if ($countrykey) { 
    $q  = $insert = 'INSERT INTO db_countries (countrykey, countryname, countrynamelat) VALUES ("' . $countrykey . '", "' . cp1251_to_utf8($countryname) . '", "' . $countrynamelat . '")'; 
    mysql_query($q); 
} else { 
    echo "not valid key of country"; 
} 

обновление: действительно, исходный XML-файл показан для Windows 1251 кодировок

UPDATE (2): я тестировал код против этого отличной маленькой функции, и она работает на последнем :)

function cp1251_to_utf8($s) 
    { 
    if ((mb_detect_encoding($s,'UTF-8,CP1251')) == "WINDOWS-1251") 
    { 
    $c209 = chr(209); $c208 = chr(208); $c129 = chr(129); 
    for($i=0; $i<strlen($s); $i++) 
     { 
     $c=ord($s[$i]); 
     if ($c>=192 and $c<=239) $t.=$c208.chr($c-48); 
     elseif ($c>239) $t.=$c209.chr($c-112); 
     elseif ($c==184) $t.=$c209.$c209; 
     elseif ($c==168) $t.=$c208.$c129; 
     else $t.=$s[$i]; 
     } 
    return $t; 
    } 
    else 
    { 
    return $s; 
    } 
    } 

заслуга Martin Petrov

+0

не помогает, если i echo $ element ["countryname"] с utf8_encoding Я получаю одно и то же дерьмо: P, но без того, чтобы получить именно то, что мне нужно, может быть проблема в базе данных –

+0

@peterneok: обновил код, успешно протестирован на localhost –