【问题标题】:xml to php and parse encoding errorxml 到 php 并解析编码错误
【发布时间】:2012-05-18 10:11:18
【问题描述】:

我正在从 url 解析 xml 文件(在下面的代码中),使用 file_get_contents() 函数和 simpleXML,将数据插入表中,我做得很好,但我有编码问题(俄语单词)我明白了 ->Черногория;文件和数据库编码设置为utf-8;

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";
    }
}

【问题讨论】:

  • 源编码为windows-1251,如浏览器视图源中所示,您的数据库为utf-8...希望在将xml数据插入数据库之前先运行适当的转换。

标签: php xml encoding cp1251


【解决方案1】:

确保您也插入 Unicode 内容,数据库字符集没有进行任何“自动”转换。

作为替代方案,我建议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

【讨论】:

  • 没有帮助,如果我使用 utf8_encoding 回显 $element["countryname"],我会得到同样的结果:P,但如果没有我得到我需要的东西,可能是数据库中的问题
  • @peterneok : 更新代码,在本地测试成功
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多