AngularJS $http传Emoji至PHP后无法正常存入MySQL问题排查
解决Ionic v1 + PHP + MySQL的Emoji存储/显示乱码问题
你已经做了不少基础配置,但几个关键细节没处理到位,导致Emoji这类4字节UTF-8字符无法正确传输和存储。我帮你梳理下需要修正的核心问题:
1. 修正AngularJS的请求Content-Type
你当前设置的headers: {'Content-Type': 'application/x-www-form-urlencoded'}和发送JSON数据的方式不匹配,这会导致Emoji在编码过程中被破坏。改成application/json,让Angular正确发送UTF-8编码的JSON:
$scope.sendMessage = function(for_account_id, message){ if(for_account_id != null && message != null){ $http({ method: 'post', url: 'myurl', data: { from_account_id: $rootScope.unique_id, for_account_id: for_account_id, message: message, }, headers: {'Content-Type': 'application/json'} // 这里修改为JSON类型 }).then(function successCallback(data){ $scope.thisMessage = null; $scope.getMessages(); $rootScope.webSocket.send($stateParams.chatId + "|" + $rootScope.unique_id + "|" + 'newMessage'); $scope.markAsRead(); }) } }
2. 彻底修正PDO数据库连接配置
你的数据库连接代码里存在冲突:明明指定了charset=utf8mb4,却又执行SET NAMES utf8和SET CHARACTER_SET utf8_unicode_ci,这会强制把连接编码改回不支持4字节字符的utf8,直接导致Emoji存储成?。
修改config.php里的连接代码,统一使用utf8mb4:
<?php $hostname='myhost'; $username='myuser'; $password='mypassword'; try { // 直接在DSN里指定charset=utf8mb4,无需额外的SET语句 $dbh = new PDO("mysql:host=$hostname;dbname=mydbname;charset=utf8mb4", $username, $password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo $e->getMessage(); } ?>
3. 确认数据库表和字段的字符集
虽然你提到已设置utf8mb4,但再快速检查一遍:
- 表的
CHARACTER SET为utf8mb4,COLLATE为utf8mb4_unicode_ci(或其他utf8mb4系列排序规则) message字段的类型为TEXT或VARCHAR,且字符集继承自表(或显式设置为utf8mb4)
4. 确保PHP处理字符串的编码一致性
在接收数据的PHP代码开头添加编码强制设置,避免PHP内部处理时乱码:
<?php header('Content-Type: text/html; charset=utf-8'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET'); header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept"); // 强制PHP使用UTF-8处理所有字符串 mb_internal_encoding('UTF-8'); include_once 'config.php'; $data = file_get_contents("php://input"); $data = json_decode($data, true); // ... 后续存储代码不变 ?>
做完这些修改后,Emoji应该就能正常传输、存储和显示了。核心问题是数据库连接编码被错误覆盖,加上请求Content-Type不匹配导致的编码混乱。
内容的提问来源于stack exchange,提问作者SupremeDEV
相关产品推荐
相关产品推荐

