我有一个使用 PHP 8.3 的 laravel 11 应用程序,并且我在 postgres 数据库中的
text
列中存储了一个字符串,如下所示:We’re excited to have you join the team today! \u1F60A
。
我正在使用用于最终用户 SMS 消息传递的 AWS 开发工具包(他们的 PinpointSmsVoiceV2 API)向我们的员工发送有关各种 HR/入职截止日期的短信。
如果我尝试提交像
😊
这样的原始表情符号,AWS SDK 会给我一个关于无效参数的错误。我与 AWS 客户支持人员交谈,他们确认需要以 unicode 形式提交,如 \u1F60A
。
问题是,PHP 似乎确实不想在其字符串中允许未转义的反斜杠。无论我尝试做什么,它都会不断添加第二个反斜杠,转义预期的反斜杠,所以我最终会得到
\\u1F60A
。
我的目标是能够从数据库中提取字符串并将其提交给 API。在从数据库和API中提取它之间,我尝试使用正则表达式删除斜杠,我尝试使用stripslashes(),我尝试转义转义字符,我尝试了ChatGPT建议的一堆东西克劳德和无序无济于事。
如果我将字符串直接硬编码到像这样的变量中
$message = <<<EOT \u{01f418} EOT;
它就可以工作,并且AWS sdk很乐意发送表情符号。
问题是,我不想对字符串进行硬编码,我想从数据库中提取它。这就是我目前正在做的
$marketSettings = RecruitmentMessagingSettings::where('organization_id', request()->user()->organization_id)
->where('market', 'TEST - MARKET')
->first();
$message = $marketSettings->in_person_message;
关于如何完成我想做的事情有什么建议吗?
您可以使用以下策略:
以 Unicode 文字形式存储和检索字符串 如果字符串以 \u1F60A 格式存储在数据库中,您希望将其解释为 Unicode 字符。您可以使用 PHP 函数将此字符串转换为实际的 Unicode 字符。
将字符串转换为 Unicode 字符 您可以编写一个小函数,使用 Unicode 转义序列(如 \u1F60A)获取字符串并将其转换为实际字符。
以下是如何执行此操作的示例:
function decode_unicode_escape_sequences($string) {
return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($matches) {
return mb_convert_encoding(pack('H*', $matches[1]), 'UTF-8', 'UCS-2BE');
}, $string);
}
// Fetch the message from the database
$marketSettings = RecruitmentMessagingSettings::where('organization_id', request()->user()->organization_id)
->where('market', 'TEST - MARKET')
->first();
// Convert the Unicode escape sequences to actual characters
$message = decode_unicode_escape_sequences($marketSettings->in_person_message);
// Now you can safely use $message with the AWS SDK