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自动处理不同的编码。

+0

+1提示DOM – Gordon 2010-07-14 12:10:14

+0

很好的建议 - 我继承了一些代码,生成XML作为一个字符串,DOM会是一个更简洁的方法 – Macros 2010-07-14 12:12:54

+0

DOM可能会产生像RSS feed那样的矫枉过正:他可能不需要所有的操作/搜索工具,而对于大文档,DOM结构的内存占用可能是过度 – Iacopo 2010-07-14 12:13:47

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

我发现iconv非常有用:

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

此代码从UTF-8到ISO-8859转换,试图重新映射“异国情调”的字符,而忽略不能转码的人。

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

Linux命令行工具,猜测文件的编码是enca

+0

我试图将iconv与输入和输出的所有编码组合,它不适用于任何 – Macros 2010-07-14 12:11:42

+0

我将编码从UTF-8更改为ISO-8859-1,它解决了我的4f在盒子问题。 – webdad3 2011-04-05 18:56:30