2011-03-10 91 views
2

我有一個PHP的Web應用程序/工具,人們最終的複製粘貼數據到。數據最終變成XML,一旦保存,某些字符會產生非常奇怪的字符。我不確定在複製粘貼之前,「」是否看起來像這樣。它可能剛剛被這樣解釋。它可能只是一個漫長的「 - 」。無論如何,所有這些角色都很奇怪。有沒有一種方法可以輕鬆地將它們去除?我怎樣才能去掉奇複製粘貼的字符,如:①™€

回答

1

這是因爲PHP採用8位編碼,但你的數據是最有可能使用UTF-8。你會發現Joel's article on Encoding非常有啓發性。

而對於簡短的回答儘量只編碼它在UTF-8

<?php 

    $text = $entity['Entity']['title']; 
    echo 'Original : ', $text."<br />"; 

    $enc = mb_detect_encoding($text, "UTF-8,ISO-8859-1"); 
    echo 'Detected Encoding '.$enc."<br />"; 

    echo 'Fixed Result: '.iconv($enc, "UTF-8", $text)."<br />"; 

?> 
+0

我希望我能接受多個答案......剛一說明,我使用CakePHP所以我用了上面的回答,用消毒庫混合,基本上消毒的所有數據beforeSave,然後創建了一個名爲unsanitize這樣當功能人們編輯他們沒有看到所有這些奇怪的html實體... – Parris 2011-03-16 23:36:33

1

它很可能是你的情況加入白名單,而不是黑名單更容易;即列出可接受的字符並剝去其餘字符。爲此,您可以輕鬆地使用preg_replace

$str = preg_replace($str, "/[A-Za-z0-9'-._\(\)/"); 
               | 
               V 
               add more chars here 
1

當你看到一個字符對開頭的重音「A」或「a」,它通常意味着你看到一個字符,其實際編碼爲iso-8859-1,由認爲其顯示utf-8的軟件顯示。

如果你打算讓人們使用不支持XML的工具在XML文檔中修改文字,可能是你最終會與ISO-8859-1編碼的字符。如果文件開頭的XML聲明存在,並且說編碼是iso-8859-1,那應該沒問題。但是,如果沒有XML聲明,或者聲明中的編碼是utf-8,那麼最終會得到損壞的數據。

你詢問有關如何修復數據,但是當您遇到數據損壞重點應該永遠是預防,而不是修復。

+0

「當你遇到數據損壞時,應該始終關注預防而不是修復」同意。不幸的是,我認爲解決方案將禁止從Word複製粘貼到其他任何內容。不是一個壞主意,但我認爲它不會好轉。 – Charles 2011-03-11 00:18:37

+0

我想這是問題...我試圖使用的iconv,但如果情況存在,用戶可以在不同的編碼複製粘貼,然後數據標準化爲UTF-8是困難的。 – Parris 2011-03-11 00:56:45