2013-03-09 30 views
6

我只想將未編碼字符轉換爲html實體,而不影響已存在的實體。我有htmlentities()字符串中的雙重編碼實體

gaIUSHIUGhj>‐ hjb×jkn.jhuh>hh> … 

當我使用htmlentities(),在&在實體的開始被重新編碼先前已編碼實體的字符串,例如:。這意味着‐和其他實體有自己的&編碼爲&

× 

我試圖解碼整個字符串,然後再對其進行編碼,但它似乎並沒有正常工作。這是我試過的代碼:

header('Content-Type: text/html; charset=iso-8859-1'); 
... 

$b = 'gaIUSHIUGhj>‐ hjb×jkn.jhuh>hh> …'; 
$b = html_entity_decode($b, ENT_QUOTES, 'UTF-8'); 
$b = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $b); 
$b = htmlentities($b, ENT_QUOTES, 'UTF-8'); 

但它似乎沒有正確的工作方式。有沒有辦法阻止或阻止這種情況發生?

回答

6

將可選的$double_encode變量設置爲false。請參閱documentation瞭解更多信息。

最後的代碼應該是這樣的:

$b = htmlentities($b, ENT_QUOTES, 'UTF-8', false); 
4

,你做得很好看documentation,但是你錯過了最好的部分。它可以是難以破譯,有時這樣的:

//  > > > > > > Scroll >>> > > > > >  Keep going. > > > >>>>>> See below. <<<<<< 
string htmlentities (string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]]) 

看到底。

我知道。 令人困惑。我通常會忽略簽名行,並直接轉到下一個塊(Parameters),以查看每個參數上的blurb。

所以,你要使用的double_encoded論證,最後才能告訴htmlentities不重新編碼(你可能想UTF-8堅持,除非你有特殊原因不能到):

$str = "gaIUSHIUGhj>&hyphen; hjb&times;jkn.jhuh>hh> &hellip;"; 

// Double-encoded! 
echo htmlentities($str, ENT_COMPAT, 'utf-8', true) . "\n"; 

// Not double-encoded! 
echo htmlentities($str, ENT_COMPAT, 'utf-8', false); 

https://ignite.io/code/513ab23bec221e4837000000