所有特殊字符在PHP/HTML中都变成了问号。

4

Php的默认字符集是UTF-8。在浏览器中,PHP和HTML中的所有特殊字符都将输出为问号“?”。所有带有特殊字符的数据都存储在数据库字段中作为UTF-8。但是,当PHP从数据库读取并输出到浏览器时,所有特殊字符(例如版权和商标符号)都会变成问号。

数据不能编码为htmlentities,否则数据会作为html代码在浏览器中输出。数据库字段具有html标记。它就像一个所见即所得的字段。

其他类似的问题并没有真正解决这个问题。我的问题是,php正在读取以utf-8编码的包括html标记、文本和特殊字符的数据库字段。然后将数据保存在另一个utf-8编码的数据库字段中。但是中间某些东西不对劲。处理完成后,新mysql列中的特殊字符变成了问号。因此,浏览器显示所有特殊字符为问号。

$conn = new mysqli($host, $username, $password, $dbName);
mysql_set_charset('utf-8',$conn);


$categoryDescription = utf8_encode(utf8_decode($var['manufacturer_overview']));

1
HTML页面不能是UTF8格式的。请检查请求发送时的标头信息。 - chris85
1
可能是重复的问题:UTF-8编码的HTML页面显示“?”而不是字符 - Jonathon Reinhart
1个回答

3
我遇到过类似的问题,但可能是由多种原因引起的。
1.检查标题是否有

标签未关闭。
<meta charset="utf-8" />

2. 只在支持特殊字符集的编辑器中打开包含特殊字符集的页面。

3. 这就是我的情况。

我使用php函数utf8_encode()将数据保存在数据库中,但在我的执行函数中,它已经存在于数据库中。

mysql_set_charset('utf8',$dbSelect);

我的函数长这样

public function execute($sql,$useDb = 1)
    {
        if($useDb == static::LOCAL)
        {
            $dbSelect = $this->conexion;
        }elseif ($useDb == static::REMOTE) 
        {
            $dbSelect = $this->paisConexion;
        }
        mysql_set_charset('utf8',$dbSelect);
        $result = mysql_query($sql,$dbSelect) or die("ERROR: Ejecuci&oacute;n de consulta: $sql<br>\n");

        return $result;
    }

所以它被编码了两次,我去掉了其中一次,现在它正常运行。

希望这些任何一个都有所帮助

谢谢


嗨,好主意但对我没用。请看更新的问题。谢谢。 - user2700690
@user2700690 兄弟,移除最后的 ecode 部分并尝试一下,utf8_encode(utf8_decode 尝试完全移除它并添加头文件,很可能您已经添加了它。 - Vikram Anand Bhushan
1
@user2700690 是的,你是对的,关于已弃用的部分 :) - Vikram Anand Bhushan
1
这是新的。http://php.net/manual/en/mysqli.set-charset.php 看起来正在进行中。现在不仅仅是?,而是保存特殊字符加上Â。 - user2700690
1
明白了!实际上是将完全相同的数据保存在新的数据库字段中。我只是在浏览器编码上硬编码了其他内容。现在它可以工作了,太神奇了!非常感谢!我从来没有想过我还需要强制mysql重新编码。 - user2700690
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接