我只希望将未编码的字符转换为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');
但它似乎没有正确的方法。有没有办法防止或阻止这种情况发生?
答案 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>‐ hjb×jkn.jhuh>hh> …";
// Double-encoded!
echo htmlentities($str, ENT_COMPAT, 'utf-8', true) . "\n";
// Not double-encoded!
echo htmlentities($str, ENT_COMPAT, 'utf-8', false);