【问题标题】:Illegal character in XmlXml 中的非法字符
【发布时间】:2011-03-15 19:40:34
【问题描述】:

我有一个 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;
}

但是这仍然没有删除它。如果我单步执行代码,则非法字符会在 Eclipse 调试窗口中展开。它遇到问题的字符串如下(希望它正确粘贴)

251gm-50

任何关于删除此字符并防止此表单发生的功能的想法都非常感谢 - 我对导入的数据几乎没有控制权,因此需要在生成 Xml 时完成。

编辑

发布后,我可以看到角色没有正确显示。在 Eclipses 窗口中查看时,它显示为 ; (没有空格 - 如果我在其中留下空格,则会呈现字符,看起来像)

【问题讨论】:

    标签: php xml


    【解决方案1】:

    您正在尝试执行字符转码。不要自己做,使用PHP库。

    我发现iconv 很有用:

    $cleanText = iconv('UTF-8','ISO-8859-1//TRANSLIT//IGNORE', $srcText);
    

    此代码从 utf-8 转换为 iso-8859,尝试重新映射“外来”字符并忽略无法转码的字符。

    我只是猜测源编码是 utf-8。您必须发现传入数据正在使用哪种编码,并在您在 XML 标头中声明的编码中进行转换。

    一个猜测文件编码的linux命令行工具是enca

    【讨论】:

    • 我尝试了 iconv 与输入和输出的所有编码组合,但它不适用于任何
    • 我将编码从 UTF-8 更改为 ISO-8859-1,它解决了我的 4f 盒装问题。
    【解决方案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 序列(实际上 ,即 0xFFFF,在 UTF-8 中无效)。这可能来自具有不同编码的不同 XML 文件的复制粘贴。

    我建议您改用 DOM extension 来进行 XML 混搭,它通过在内部将不同的编码转换为 UTF-8 来自动处理不同的编码。

    【讨论】:

    • 好建议 - 我继承了一些将 Xml 生成为字符串的代码,DOM 将是一种更简洁的方法
    • @lacopo 矫枉过正?在什么方面?对于操作 XML,DOM 是 PHP 拥有的最好的库。如果内存是个问题,可以使用 XMLWriter。在这两种情况下,结果都比使用字符串连接或重新发明这些库自己已经完成的所有事情更可靠。
    【解决方案3】:

    我想我看错了路径——而不是编码问题字符是代表“平方”符号的 HTML 实体。由于 URL 中的描述仅用于搜索目的,我可以使用以下正则表达式安全地删除所有 htmlentities:

    $content = preg_replace("/&#?[a-z0-9]+;/i","",$content);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多