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

如何防止PHP转义Unicode字符串中的反斜杠(Laravel+AWS场景)

解决PHP读取PostgreSQL存储的Unicode转义字符串适配AWS PinpointSmsVoiceV2 API问题

问题背景

使用Laravel 11(PHP 8.3),PostgreSQL的text列存储字符串:We’re excited to have you join the team today! \u1F60A。调用AWS PinpointSmsVoiceV2 API发送SMS时,遇到以下问题:

  • AWS要求提交\u1F60A格式的Unicode(或实际emoji字符,需根据实际API要求判断)
  • 从数据库读取后,字符串中的反斜杠被自动转义为\\u1F60A,常规正则替换、stripslashes无效
  • 仅硬编码HEREDOC格式$message = <<<EOT \u{01f418} EOT;可正常发送,但需从数据库动态读取内容

可行解决方案

方案1:将数据库中的Unicode转义序列转为实际emoji字符(适配API接受原生emoji的场景)

如果硬编码HEREDOC的\u{xxxx}能正常发送,说明API实际接受的是emoji字符,而非字面量的\u1F60A字符串。此时需要把数据库里的\uXXXX转义序列解析为对应字符:

$marketSettings = RecruitmentMessagingSettings::where('organization_id', request()->user()->organization_id)
            ->where('market', 'TEST - MARKET')
            ->first();

// 解析Unicode转义序列为实际字符
$message = preg_replace_callback('/\\\u([0-9A-Fa-f]{4,6})/', function ($matches) {
    // 将十六进制Unicode码转为UTF-8字符
    $unicodeCode = hexdec($matches[1]);
    return mb_chr($unicodeCode, 'UTF-8');
}, $marketSettings->in_person_message);

方案2:保留字面量\u1F60A格式(适配API要求提交转义字符串的场景)

如果API确实需要提交字面量的\u1F60A(单反斜杠开头),需确保反斜杠不被转义:

子方案2.1:修复数据库读取的转义问题

若数据库存储时反斜杠被转义为双反斜杠(即实际存储的是\\u1F60A),用字符串替换还原单反斜杠:

$message = str_replace('\\\\u', '\\u', $marketSettings->in_person_message);
// 或使用stripslashes(注意:会处理所有转义字符,需确保字符串中无其他需要保留的转义)
// $message = stripslashes($marketSettings->in_person_message);

子方案2.2:检查Laravel模型的字段转换设置

如果模型中对in_person_message字段设置了JSON转换,会自动转义反斜杠,需移除该设置:

// 在RecruitmentMessagingSettings模型中,删除或注释该行
// protected $casts = ['in_person_message' => 'json'];

子方案2.3:发送时避免自动转义

若使用AWS SDK发送时自动做了JSON编码导致反斜杠被转义,可手动构造RAW请求,或在SDK配置中关闭自动转义(具体需参考AWS SDK文档)。

验证方法

处理完成后,可通过var_dump($message)查看最终字符串格式:

  • 若目标是emoji字符,输出应显示😊而非\u1F60A
  • 若目标是字面量转义字符串,输出应显示\u1F60A而非\\u1F60A

内容的提问来源于stack exchange,提问作者vdotcodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:25:14