You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:05:05