PHP、html_entity_decode 和 htmlspecialchars_decode 将不起作用

标签 php utf-8

啊,我从来不喜欢 PHP,它太“不纯”了……

现在我必须使用它,但我遇到了一个问题:主要是 html_entity_decodehtmlspecialchars_decode 似乎都不适合我。我把这个论坛都看了一遍,什么都没有。它似乎无处不在,只是在这里行不通......

我将电影的标题发送到数据库,全部编码,然后当我从数据库中获取它时,我用这个解码它:

$title = html_entity_decode($row['Title']);

然后:

"title":"'.$title.'"

它是我用 PHP 创建的 JSON 对象的一部分。虽然当我查看那个特定对象的属性时,它的标题没有被解码,但实际上没有任何变化。我尝试了问题标题中所述的两个函数,并尝试了像 UTF-8 这样的编码,还有一些选项,如 ENT_QUOTES 或 ENT_COMPAT,但它仍然不起作用。

有人能告诉我为什么 PHP 不服从我吗?

编辑: 这是我在那里所做的全部工作:

echo 'var serverVideos = [';
while($row = mysql_fetch_array($result))
{
    $currentRow++;
    $data = array('posterSrc' => $row["Poster_name"],
        'videoSrc' => $row["Video_name"],
        'videoType' => $row["Type"]);

$title = html_entity_decode($row['Title']);
$poster = html_entity_decode($row['Poster_name']);
echo'{"id":"'.$row["ID"].'", "vimeoID":"'.$row["VimeoID"].'", "title":"'.$title.'" ,"client":"'.$row["Client"].'" , "production":"'.$row["Production"].'", "type":"'.$row["Type"].'", ';
            if($row["Type"] != "vimeo")
            {
                echo '"href":"'.http_build_query($data).'"';
            }
            else
            {
                echo '"href":"'.$row["Video_name"].'"';
            }
            echo ', "poster":"'.$poster.'"}';

            if($currentRow != $rowNumber)
            {
                echo ',';
            }
        }
        echo '];';

抱歉,有点乱,在 Notepad++ 中看起来更好;/ 我实际上是在一个脚本标签中输出它来制作一个对象,我查看了 json_encode 并没有真正理解它如何帮助我,因为我不知道我将如何使用这么多变量,抱歉。

此外,这是使用来自该 JSON 对象的变量使用 javascript 制作标签后来自源代码的代码:

<a production=" " client=" " title="O.S.T.R &amp;quot;Track #12&amp;quot;" href="http://player.vimeo.com/video/43886787?title=1&amp;amp;byline=1&amp;amp;portrait=1" rel="shadowbox" class="box">

最佳答案

(我无法将其放入评论中,所以它必须是一个答案。)

这里真正的问题是数据放入数据库的方式。让我们看一下您提供的示例字符串:

$raw="O.S.T.R &amp;quot;Track #12&amp;quot;";
echo html_entity_decode($raw);
//   O.S.T.R &quot;Track #12&quot;
echo html_entity_decode(html_entity_decode($raw));
//   O.S.T.R "Track #12"

所以用户输入的是O.S.T.R "Track #12"

这里的关键概念是它应该如何存储在数据库中。因为那是实际数据。不要将修改后的版本存储在数据库中。相反,根据您需要的输出方式适本地转义数据。

这是我将用于以下几个示例的示例数据:

$title='O.S.T.R "Track #12"';
$description='A&B or A\B ??';

因此,当您在 SQL 语句中写入数据时,您使用 addslashes(或准备好的语句,但我将在此处展示 addslashes 方法):

$sql="INSERT INTO xxx(title,description) VALUES('".addslashes($title)."','".addslashes($description)."')";
//   INSERT INTO xxx(title,description) VALUES('O.S.T.R \"Track #12\"','A&B or A\\B ??')

对于json编码,使用json_encode:

$json=json_encode( array('title'=>$title,'description'=>$description) );
//   {"title":"O.S.T.R \"Track #12\"","description":"A&B or A\\B ??"}

要编码为 csv,在日志文件中,使用 fputcsv:

$fp=fopen("my.csv","a");
fputcsv($fp, array($title,$description) );
fclose($fp);
//   "O.S.T.R ""Track #12""","A&B or A\B ??"

要输出为 HTML,请使用 htmlspecialchars()(或 html_entity_encode()):

$html='<h3>'.htmlspecialchars($title).'</h3>';
$html.='<p>'.htmlspecialchars($description).'</p>';
//   <h3>O.S.T.R &quot;Track #12&quot;</h3><p>A&amp;B or A\B ??</p>

现在,也许我仍然没有说服您,您仍然真的想在数据库中存储 HTML 就绪数据,并且每次要将其用于其他任何事情时都需要额外的步骤来取消 html 化?在那种情况下,您的示例字符串应该如下所示:

O.S.T.R &quot;Track #12&quot;

而你的字符串看起来像:

O.S.T.R &amp;quot;Track #12&amp;quot;

你看出区别了吗?第一个只对 html 实体进行了一次编码。调用 html_entity_decode() 将正确解码。第二个对它们进行了两次编码。它不再被编码为 html 实体。这就是我们所说的double-entity-encoded-format 或简称 DEEF。 PHP 中没有deef_decode() 函数,我听说过的任何一种计算机语言,甚至比PHP 更纯粹的语言都没有。这是因为没有人需要这个功能。

总结:您的代码中有一个错误会写入他们的数据库。您正在接收带有已编码实体的字符串,但您在将它们写入数据库之前再次对它们进行编码。

结论:回到我上面给出的关键概念,您应该在将这些 html 实体写入数据库之前对其进行解码,而不是对它们进行第二次编码。但是,当您进行此更改时,请确保所有从数据库获取数据并将其放入 HTML 或 XML 的代码都知道它现在必须对实体进行编码。

关于PHP、html_entity_decode 和 htmlspecialchars_decode 将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11281576/

相关文章:

php - 使用 php 在 rhel 4 服务器上将 .doc 和 .xls 文件转换为 html

php - 从 mysql 中的 3 列中选择文件并压缩它们

mysql - 带有国家字符的列错误的数据太长

utf-8 - UTF-16 有什么意义?

linux - Mac 与 Linux 中的可打印字符

php - 我如何在php中将值与一个整数分开

php - Kohana::$log上的Kohana错误 “Call to a member function add() on a non-object”

php - 在 CodeIgniter 中绕过 Controller 的方法?

java - C-Server Socket 变成错误的数据包

PHP: mb_strtoupper 不工作