PHP输出特殊字符异常:含ö/ä/å时返回空白的问题求助
解决PHP输出JSON含特殊字符(ö/ä/å)时空白的问题
兄弟,这个坑我踩过!遇到这种特殊字符就输出空白,大概率是字符编码不匹配导致json_encode()直接失败了,给你几个一步步排查解决的方法:
1. 先把数据库连接的字符集掰正
数据库读取出来的字符如果不是UTF-8,json_encode()根本处理不了。举两个常用扩展的设置方式:
- 如果用mysqli:连接数据库后立刻加这行
mysqli_set_charset($conn, 'utf8mb4'); - 如果用PDO:在连接字符串里直接指定字符集
这里用$pdo = new PDO("mysql:host=你的主机;dbname=你的库;charset=utf8mb4", $用户名, $密码);utf8mb4而不是utf8,因为它支持更多特殊字符,包括你遇到的ö/ä/å。
2. 给json_encode()加错误检测
json_encode()失败时会返回false,直接输出的话就是空白。加个错误提示,就能知道问题出在哪:
$data = array( "email" => $email, "firstname" => $firstname, "lastname" => $lastname, "phone" => $phone, "role" => $role ); $jsonData = json_encode($data); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON编码出错啦:' . json_last_error_msg()); } // 别忘了设置正确的响应头 header('Content-Type: application/json; charset=utf-8'); echo $jsonData;
运行后如果有错误,会直接告诉你是编码问题还是其他原因,比瞎猜管用多了。
3. 强制转换字段编码(兜底方案)
如果数据库那边一时改不了,或者还是有问题,可以手动把每个字段转成UTF-8:
$data = array( "email" => mb_convert_encoding($email, 'UTF-8', 'auto'), "firstname" => mb_convert_encoding($firstname, 'UTF-8', 'auto'), "lastname" => mb_convert_encoding($lastname, 'UTF-8', 'auto'), "phone" => $phone, // 数字一般不用转 "role" => mb_convert_encoding($role, 'UTF-8', 'auto') );
mb_convert_encoding会自动识别原编码,转成UTF-8后json_encode就能正常处理了。
最后提醒
一定要记得输出前设置Content-Type头,不然浏览器可能会把JSON当成普通文本,甚至出现乱码。
内容的提问来源于stack exchange,提问作者Alexander Jovric
相关产品推荐
相关产品推荐

