如何防止 php 转义 unicode 字符串中的反斜杠?

问题描述 投票:0回答:1

我有一个使用 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建议的一堆东西克劳德和无序无济于事。

我最接近的是这个。 https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax

如果我将字符串直接硬编码到像这样的变量中

$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;

关于如何完成我想做的事情有什么建议吗?

php laravel amazon-web-services unicode sms
1个回答
0
投票

您可以使用以下策略:

  1. 以 Unicode 文字形式存储和检索字符串 如果字符串以 \u1F60A 格式存储在数据库中,您希望将其解释为 Unicode 字符。您可以使用 PHP 函数将此字符串转换为实际的 Unicode 字符。

  2. 将字符串转换为 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
  1. 通过AWS SDK发送转换后的消息 字符串转换后,可以毫无问题地传递到 AWS 开发工具包,因为字符串现在的格式正确。
© www.soinside.com 2019 - 2024. All rights reserved.