htmlentities()在字符串中双重编码实体

时间:2013-03-09 03:31:14

标签: php

我只希望将未编码的字符转换为html实体,而不会影响已存在的实体。我有一个以前编码实体的字符串,例如:

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'); 

但它似乎没有正确的方法。有没有办法防止或阻止这种情况发生?

2 个答案:

答案 0 :(得分:6)

将可选的$double_encode变量设置为false。有关详细信息,请参阅documentation

您生成的代码应如下所示:

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

答案 1 :(得分:5)

你很好看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