2012-03-14 22 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字符的问题。