AWS SNS / SnsClient 是否支持发送包含 UTF8 字符的 SMS 消息?



我有以下简单的代码根据传入的 api 请求发送短信,但消息到达手机时,重音被相应的 ASCII 版本替换。

AWS SNS 是否支持发送诸如"您赢得了 áéíóúñ 产品"之类的消息,以便它们正确到达?

<?php
use IlluminateHttpRequest;
use IlluminateRoutingController as BaseController;
use AwsSnsSnsClient;
use AwsCredentialsCredentials;
class Controller extends BaseController
{
public function send(Request $request){    
$to = $request->input('phone');
$message = $request->input('message');
$client = new SnsClient([
'version' => '2010-03-31',
'credentials' => new Credentials(
env('SMS_AWS_ACCESS_KEY_ID'),
env('SMS_AWS_SECRET_ACCESS_KEY')
),
'region' => env('SMS_AWS_DEFAULT_REGION'),
]);
$client->SetSMSAttributes([
'attributes' => [
'DefaultSMSType' => 'Transactional',
]
]);
$client->publish([
'Message' => $message,
'PhoneNumber' => $to,
]);
return [$to, $message];
}
}

用于发送消息的软件包是适用于 PHP 的 AWS 开发工具包:
https://github.com/aws/aws-sdk-php

官方文档:
https://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Sns.SnsClient.html

一些例子:
https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/sns-examples-sending-sms.html

这个沮丧悲伤的人有我能找到的唯一与这个问题有关的问题:
https://forums.aws.amazon.com/thread.jspa?threadID=315153

背景信息

如 SNS 文档中所述,每条 SMS 消息最多可包含 140 个字节,字符配额取决于编码方案。例如,短信可以包含:

  • 160 个 GSM 字符
  • 140 个 ASCII 字符
  • 70 个 UCS-2 字符

GSM-7是SMS消息的标准字母表,您可以在此处查看其字符集。

发送短信时,SNS 会自动以最紧凑的编码发送消息。当消息中包含非 GSM-7 字符时,消息必须以 UCS-2 编码。

UCS-2 是固定宽度的编码;每个编码的代码点(又名字符(将恰好占用 2 个字节。由于 SMS 消息以 140 个八位字节传输,因此以 UCS-2 编码的消息最多包含 70 个字符:(140*8) / (2*8) = 70

例如,假设一条消息包含 152 个 GSM-7 兼容字符。如果添加单个额外的 Unicode(非 GSM(字符,而不是作为单个消息发送,现在在 UCS-2 中编码时,该字符将被分段并按三条消息收费。

问题

我不完全确定为什么,但似乎您的消息没有自动编码为 UCS-2。

溶液

如果您同意将编码为 UCS-2(每个消息段的可用字符较少(,则可以包含非 GSM 字符以强制/确保将消息编码为 UCS-2。

例如,您可以在邮件前面加上 Unicode 零宽度空格字符 (U+200B(。

在代码示例中执行此操作可能如下所示:

$message = $request->input('message');
$message = "u{200B}" . $message;

最新更新