Xml中的非法字符
我有一个PHP文件,它根据从多个源导入的数据生成Xml站点地图。由于导入数据的一行中存在非法字符,我的站点地图目前没有正确形成,但我正在努力将其删除。Xml中的非法字符
该字符看起来代表'平方'或上标2,并表示为正方形。我试过把它粘贴到一个十六进制编辑器中,但它被显示为?,并且十六进制代码也对应于?。我也尝试使用iconv从所有源编码转换到所有目的地编码,没有组合去除这个字符。
我也有以下函数删除非ASCII字符:
function stripInvalidXml($value)
{
$ret = "";
$current;
if (empty($value))
{
return $ret;
}
$length = strlen($value);
for ($i=0; $i < $length; $i++)
{
$current = ord($value{$i});
if (($current == 0x9) ||
($current == 0xA) ||
($current == 0xD) ||
(($current >= 0x20) && ($current <= 0xD7FF)) ||
(($current >= 0xE000) && ($current <= 0xFFFD)) ||
(($current >= 0x10000) && ($current <= 0x10FFFF)))
{
if($current != 0x1F)
{
$ret .= chr($current);
}
}
else
{
$ret .= " ";
}
}
return $ret;
}
但是这仍然没有删除它。如果我单步执行代码,非法角色会扩展到&#65535;在月食调试窗口中。它是一种与低于问题的字符串(希望它正确地贴)
251gm-50
上的功能的任何想法,这将删除此字符,并防止这种形式的出现是非常感激 - 我没有什么控制权导入的数据,因此需要在Xml生成时完成。
编辑
张贴我可以看到的字符不能正确显示后。在Eclipses窗口中查看时,它显示为&#65535; (不带空格 - 如果我离开的空间在它呈现的特点,它看起来像&#65535;)
我觉得我一直在寻找错了路 - 而不是编码问题字符是代表“平方”符号的HTML实体。由于在URL中的描述只存在于搜索enging目的,我可以放心地用下面的正则表达式中删除所有ヶ辆:
$content = preg_replace("/&#?[a-z0-9]+;/i","",$content);
这是错误的:因为它在一个字节
$current = ord($value{$i});
if (($current == 0x9) ||
($current == 0xA) ||
($current == 0xD) ||
(($current >= 0x20) && ($current <= 0xD7FF)) ||
(($current >= 0xE000) && ($current <= 0xFFFD)) ||
(($current >= 0x10000) && ($current <= 0x10FFFF)))
{
if($current != 0x1F)
$ret .= chr($current);
}
ord()
永远不会返回不是0xFF的还有更大逐字节的方式。
我猜你的XML是无效的,因为该文件包含无效的UTF-8序列(实际上&#65535,即0xFFFF,在UTF-8中无效)。这可能来自具有不同编码的不同XML文件的复制粘贴。
我建议您使用DOM extension来代替您的XML mash-up,它通过将它们内部转换为UTF-8自动处理不同的编码。
您正在尝试执行字符转码。不要自己动手,使用PHP库。
我发现iconv
非常有用:
$cleanText = iconv('UTF-8','ISO-8859-1//TRANSLIT//IGNORE', $srcText);
此代码从UTF-8到ISO-8859转换,试图重新映射“异国情调”的字符,而忽略不能转码的人。
我只是猜测源编码是utf-8。您必须发现传入数据正在使用哪种编码,并将其转换为您在XML标头中声明的编码。
Linux命令行工具,猜测文件的编码是enca
+1提示DOM – Gordon 2010-07-14 12:10:14
很好的建议 - 我继承了一些代码,生成XML作为一个字符串,DOM会是一个更简洁的方法 – Macros 2010-07-14 12:12:54
DOM可能会产生像RSS feed那样的矫枉过正:他可能不需要所有的操作/搜索工具,而对于大文档,DOM结构的内存占用可能是过度 – Iacopo 2010-07-14 12:13:47