我有一个PHP文件,它根据从许多来源导入的数据生成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;
}
然而,这仍然没有删除它。如果我单步执行代码,非法字符扩展到???在日食调试窗口中。它遇到问题的字符串如下(希望它正确粘贴)
251gm-50
有关删除此字符并防止出现此形式的函数的任何想法都非常感激 - 我几乎无法控制导入的数据,因此需要在生成Xml时完成。
修改
发布后我可以看到该角色没有正确显示。在Eclipses窗口中查看时,它显示为&amp; #65535; (没有空格 - 如果我在其中留下空格,则呈现字符,看起来像???)
答案 0 :(得分:3)
您正在尝试执行字符转码。不要自己动手,使用PHP库。
我发现iconv
非常有用:
$cleanText = iconv('UTF-8','ISO-8859-1//TRANSLIT//IGNORE', $srcText);
此代码从utf-8转换为iso-8859,试图重新映射“异国情调”字符并忽略那些无法转码的字符。
我只是猜测源编码是utf-8。您必须发现传入数据使用的编码,并在您在XML标头中声明的编码中进行翻译。
猜测文件编码的linux命令行工具是enca
答案 1 :(得分:2)
这是错误的:
$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序列(实际上&amp;#65535;,即0xFFFF,在UTF-8中无效)。这可能来自具有不同编码的不同XML文件的复制粘贴。
我建议您使用DOM extension代替进行XML mash-up,它通过内部转换为UTF-8自动处理不同的编码。
答案 2 :(得分:1)
我认为我正在寻找错误的路径 - 而不是编码问题字符是表示'平方'符号的HTML实体。由于URL中的描述仅用于搜索引擎目的,我可以使用以下正则表达式安全地删除所有htmlentities:
$content = preg_replace("/&#?[a-z0-9]+;/i","",$content);