2010-07-14 136 views
3

我有一個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;)

回答

1

我覺得我一直在尋找錯了路 - 而不是編碼問題字符是代表「平方」符號的HTML實體。由於在URL中的描述只存在於搜索enging目的,我可以放心地用下面的正則表達式中刪除所有ヶ輛:

$content = preg_replace("/&#?[a-z0-9]+;/i","",$content); 
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序列(實際上&#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

3

您正在嘗試執行字符轉碼。不要自己動手,使用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