Xml中的非法字符

时间:2010-07-14 11:59:40

标签: php xml

我有一个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; (没有空格 - 如果我在其中留下空格,则呈现字符,看起来像???)

3 个答案:

答案 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);
相关问题