xml转换为php并解析编码错误
我正在从url解析xml文件(在下面的代码中),使用file_get_contents()函数和simpleXML将数据插入到表中,我做得很好,但我在编码(俄语单词)方面有问题,我得到了这个->ª§¥ССЂЅѕіѕССЂёСЏ;文件和数据库编码设置为utf-8xml转换为php并解析编码错误,php,xml,encoding,cp1251,Php,Xml,Encoding,Cp1251,我正在从url解析xml文件(在下面的代码中),使用file_get_contents()函数和simpleXML将数据插入到表中,我做得很好,但我在编码(俄语单词)方面有问题,我得到了这个->ª§¥ССЂЅѕіѕССЂёСЏ;文件和数据库编码设置为utf-8 require_once 'mysql_connect.php'; /** * * */ error_reporting(E_ALL); $sql = "CREATE TABLE IF NOT EXISTS `db_countrie
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";
}
}
还要确保插入Unicode内容,因为数据库字符集没有进行任何“automagic”转换 作为替代方案,我建议
utf8\u 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源文件显示了一个Windows1251字符集
更新(2):我针对这个漂亮的小函数测试了代码,它终于可以工作了:)
功能cp1251到utf8($s)
{
如果((mb检测编码($s,'UTF-8,CP1251'))==“WINDOWS-1251”)
{
$c209=chr(209);$c208=chr(208);$c129=chr(129);
对于($i=0;$i=192和$c239)$t.=c209.chr($c-112);
其他(c==184元)t.=$c209.$c209 ;;
其他(c==168)t.=$c208.$c129 ;;
else$t.=$s[$i];
}
返回$t;
}
其他的
{
返回$s;
}
}
贷记到没有帮助,如果我用utf8\u编码回显$element[“countryname”],我会得到同样的结果:p,但如果我没有得到我所需要的,可能会出现问题database@peterneok:已更新代码,已在LocalHost上成功测试源代码编码为
windows-1251
,如浏览器视图源代码中所示,您的数据库是utf-8
…在将xml数据插入数据库之前,您希望先运行适当的转换。
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;
}
}