MySQL特殊字符在网站显示为带问号菱形的解决求助
这个问题我碰到过好多次了——数据库存得好好的,网页输出就变菱形问号,核心原因就是编码链上某一环没跟上统一的UTF-8(或utf8mb4)节奏。结合你的Ubuntu+Apache2+PHP7.2环境,给你一步步排查解决的方法:
先确保网页输出的编码是UTF-8
如果是纯PHP输出,一定要在所有内容(包括空格、HTML标签)之前设置响应头:header('Content-Type: text/html; charset=utf-8');如果输出的是HTML页面,记得在
<head>里加meta标签:<meta charset="UTF-8">这一步是基础,保证浏览器用UTF-8解码内容。
PHP连接MySQL时必须强制指定utf8mb4编码
很多人只改了数据表的UTF-8设置,但连接数据库时没指定编码,导致MySQL和PHP之间的传输用了默认的 latin1,自然就乱码了。- 如果你用的是mysqli扩展:
$conn = mysqli_connect('localhost', 'user', 'pass', 'dbname'); mysqli_set_charset($conn, 'utf8mb4'); // 这里用utf8mb4比utf8更全面,兼容所有Unicode字符 - 如果你用的是PDO扩展:
$pdo = new PDO( 'mysql:host=localhost;dbname=mydb;charset=utf8mb4', 'user', 'pass' );
别用
SET NAMES utf8,虽然表面生效,但mysqli_set_charset和PDO的charset参数会处理字符集校验等细节,更可靠。- 如果你用的是mysqli扩展:
检查Apache的默认编码配置
编辑Apache的全局字符集配置文件/etc/apache2/conf-available/charset.conf,确保里面有这一行:AddDefaultCharset UTF-8保存后重启Apache生效:
sudo systemctl restart apache2如果你不想改全局配置,也可以在网站根目录的
.htaccess文件里加同样的AddDefaultCharset UTF-8。验证PHP的默认字符集设置
找到PHP7.2的配置文件(通常是/etc/php/7.2/apache2/php.ini),搜索default_charset,设置为:default_charset = "UTF-8"改完同样要重启Apache。你可以创建一个
phpinfo.php文件,输出<?php phpinfo(); ?>,打开后搜索default_charset确认是否生效。排查中间转码环节
检查你读取数据库后有没有多余的转码操作,比如误加了mb_convert_encoding($text, 'GBK', 'UTF-8')这种反向转码的代码;如果用了模板引擎(比如Smarty),也要确认模板的编码设置是UTF-8。
按照这个流程走下来,从数据库连接、PHP输出、服务器配置到网页解码全链路统一UTF-8,é和€应该就能正常显示了。
内容的提问来源于stack exchange,提问作者Devbizz

