2012-03-14 87 views
2

我在我的應用程序中有一個描述字段,如果我包含這樣的引用:'它打破了一切。我在整個描述字段上使用了htmlentities(),所以我嘗試了htmlspecialchars(),但它也打破了。PHP htmlentities和htmlspecialchars打破我的字符串

下面的截圖,我送字符串「我想這個工作」,並得到了後續的混亂

This is what my string looks like after being run through htmlentities This is what my string looks like after being run through htmlentities

我已經在過去的這個問題,但我我不知道如何解決它。

+0

將文檔的編碼設置爲'UTF-8',看看是否修復它。另外,如果你正在創建â,這可能意味着你是雙重編碼,所以&實際上是一個& – MetalFrog 2012-03-14 15:55:17

回答

5

我改變我的代碼

$text = htmlentities($text, ENT_QUOTES); 

到固定的問題:

$text = htmlentities($text, ENT_QUOTES, 'utf-8'); 

這是怪異的,因爲PHP列出了默認設置爲UTF-8。

+2

從[手冊](http://php.net/manual/en/function.htmlentities.php):*「如果省略,則此參數的默認值爲5.4之前版本的PHP中的ISO-8859-1 .0和UTF-8從PHP 5.4.0開始。「*所以UTF-8默認是相當新的。我總是使用包裝函數,所以你可以很容易地改變這些東西,比如'escape_html()' – 2012-03-15 12:23:02

1

如果我只需要替換某些字符,我有時候會創建一個簡單的查找和替換腳本。

<?php 
    $bad = array('’', '&'); // add whatever you don't want here 
    $good = array('&rsquo;', '&amp;'); // replace it here 
    $description_field = str_replace($bad, $good, $description_field); 
?> 
+0

但我不想替換它們,我只是希望我的腳本不要中斷。 – 2012-03-14 15:58:18

0

我敢肯定htmlentitieshtmlspecialchars不是UTF-8安全功能。他們將Unicode字符的第一個字節看作是要進行編碼的HTML實體,然後,當瀏覽器讀取所謂的UTF-8內容時,它會看到一個HTML實體,後面跟着兩個無效字節。

您可能需要尋找到像mb_ereg_replace功能和手動替換不安全的字符:

$output = mb_ereg_replace("/</","&lt;",$input); 

這就是你真的需要做一個字符串HTML安全的。我似乎無法找到一個多字節安全的str_replace,但是它的工作原理也一樣,它可以確保您從未遇到過使用UTF-8字符的問題。