啊,我从来不喜欢PHP,它太“不纯”了.
现在我不得不使用它,我对它有一个问题:主要是html_entity_decode和htmlspecialchars_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 &quot;Track #12&quot;" href="http://player.vimeo.com/video/43886787?title=1&amp;byline=1&amp;portrait=1" rel="shadowbox" class="box">
发布于 2012-07-03 08:02:17
(我不能把这个放在评论中,所以它必须是一个答案。)
这里真正的问题是数据放入数据库的方式。让我们看一下您给出的示例字符串:
$raw="O.S.T.R &quot;Track #12&quot;";
echo html_entity_decode($raw);
// O.S.T.R "Track #12"
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 (或预准备语句,但我将在这里展示加斜杠的方法):
$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 "Track #12"</h3><p>A&B or A\B ??</p>现在,也许我还没有说服您,您仍然希望在数据库中存储支持HTML的数据,并在每次想要将其用于其他用途时执行额外的取消htmlify步骤?在这种情况下,示例字符串应该如下所示:
O.S.T.R "Track #12"而你的字符串看起来像这样:
O.S.T.R &quot;Track #12&quot;你看到区别了吗?第一个只对html实体进行了一次编码。对html_entity_decode()的调用将正确解码它。第二个对它们进行了两次编码。它不再被编码为html实体。这就是我们所说的双实体编码格式,简称DEEF。在PHP中没有deef_decode()函数,或者我听说过的任何计算机语言,甚至没有比PHP更纯粹的语言。原因是没有人需要这个函数。
摘要:您的代码中有一个写入数据库的bug。您正在接收已经编码了实体的字符串,但是在将它们写入数据库之前,您正在对它们进行再次编码。
结论:回到我上面给出的关键概念,你应该在将这些html实体写入数据库之前解码掉它们,而不是对它们进行第二次编码。但是,当您进行此更改时,请确保从数据库获取数据并将其放入HTML或XML的所有代码都知道它现在必须对实体进行编码。
发布于 2012-07-01 19:36:08
我不完全确定这里的问题是什么,但我想知道您为什么不使用json_encode()来构建对象?
这将为您解决所有的编码问题。
发布于 2012-07-02 19:32:06
好吧,如果有人遇到同样的问题,自己也不知道这是什么废话,解决方案很简单,PHP函数html_entity_decode和htmlspecialchars_decode不会完全剥离特殊字符,它只会剥离一个特殊字符,如果你有两个特殊字符,你需要运行这个函数两次……例如,该字符串:
O.S.T.R &quot;Track #12&quot;
需要剥离两次,第一次剥离&,然后另一次剥离那些"-es“。
https://stackoverflow.com/questions/11281576
复制相似问题