我正在使用mysqli和PHP从数据库中提取数据。
这工作正常,但我得到一个随机字符(黑色问号)取代撇号在单词中,所以我认为我可以使用htmlspecialchars()
函数让它们正确显示,但它不起作用。
我的代码是这样的
while($row = $result->fetch_assoc())
{
$desc = htmlspecialchars($row['description'], ENT_QUOTES);?>
<div class="timeline-key">
<div class="fluid key-content">
<p><?php echo $desc?></p>
</div>
</div><?php
}
现在数据库中任何包含撇号$desc的记录都不输出任何内容,所有其他记录都输出好吗?
现在,如果我尝试完全相同的来一个字符串,不是从数据库中拉它显示它OK?
从您链接的网站来看,很明显页面本身使用UTF-8进行字符编码(<meta charset="UTF-8">
)。似乎从您获取数据的数据库使用的字符编码不等于ini_get("default_charset")
值。如果编码错误,htmlspecialchars
将返回空字符串,这就是您在这里看到的。
解决方案是在使用的字符编码上保持一致(或显式)。当您对所有内容使用一个字符编码时,这要简单得多。让我们使用UTF-8作为一个很好的例子:
- 告诉浏览器你正在使用UTF-8。你已经用meta标签这样做了,所以这很好。
-
告诉PHP你正在使用UTF-8。确保php.ini设置
default_charset
为UTF-8
。 - 告诉MySQL你正在使用UTF-8。确保数据库中的表使用UTF-8作为编码-edit-或者告诉MySQL接口使用UTF-8
或者,您可以使用像mb_convert_encoding
这样的函数来转换不同字符编码之间的字符串,这些字符编码是浏览器期望的,PHP假定的,MySQL用来存储和提供文本的。