如何防止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
相关产品推荐
相关产品推荐

