我正在使用Twilio的短信服务,我希望能够发送普通的非英语罗马字母字符(用于欧洲人名)以及ASCII字符。我需要的字符是Unicode的“拉丁语-1补充块”的子集。而且,他们都在GSM-7字符集。但它们在手机上作为替换字符出现。例如,当我发送J'aime l'été... éÉÑñ时,电话显示J'aime l'?t?... ????。
我正在使用一个在Sprint上运行的带有iPhone 13的美国iPhone进行测试。Verizon iPhones也显示了同样的问题。
下面是再现问题的C#代码。将smartEncoded的值从true更改为false,反之亦然
const string sid = "REDACTED";
const string token = "REDACTED";
const string from = "REDACTED";
const string to = "REDACTED";
const string message = "J'aime l'été... éÉÑñ";
TwilioClient.Init(sid, token);
var msg = MessageResource.Create(
body: message,
from: new Twilio.Types.PhoneNumber(from),
to: new Twilio.Types.PhoneNumber(to),
smartEncoded: true
);Twilio声称他们使用的是GSM-7。在可以使用该字符集的时候发送消息,如果不能使用UCS-2,则返回到UCS-2。
如果我发送一条强制Twilio使用UCS-2编码的信息,那么一切都可以正常工作。例如,附加®就能做到这一点。当然,在UCS-2中发送的每条短信都有较短的最大长度.
const string message = "J'aime l'été... éÉÑñ ®";我一定是遗漏了什么;Twilio为他们的消息大小优化特性感到自豪。我怎么才能解决这个问题?
发布于 2020-11-18 13:16:46
tl;dr:一些短消息服务中心的已知问题可以通过强制消息进入Unicode (不需要额外费用)或强制至少两个段(因为每个段收取额外费用而会有更多段)来解决。
当我的GSM编码消息包含“扩展GSM字符”时,我问Twilio支持相同/类似的问题,并收到以下回复:
有一个已知的编码问题,消息被路由到某些Verizon短消息服务中心。Verizon有许多SMSCs (短消息服务中心),它们是动态分配的(例如,一个特定的Verizon用户可以在不同的时间通过许多不同的SMSCs获得消息)。您看到的这个问题是专门针对单段消息发生的吗?如果是这样的话,它与我们在自2018年以来一直存在的某些Verizon SMSC上看到的编码问题相匹配。对于单段短消息,某些Verizon SMSCs可能会将“i”或其他扩展的GSM字符转换为"?“送货的时候。不幸的是,除了这影响到一些Verizon SMSCs之外,我们没有其他与设备相关的细节。为了避免这个问题,我们建议如下:选项1:通过包含一个非GSM字符强制将消息作为Unicode发送。要在unicode中发送消息而不通过发送>160个字符而增加额外成本,您可以在消息中包含标点符号空间。它看起来就像一个普通的空间,但因为它在常规的GSM-7范围之外,它将导致整个消息被转换为Unicode,口音将正确地传递出来。你能把这个作为一个解决办法来测试吗?请注意,USC2消息将限于每段70个字符。选项2:确保在GSM编码中消息长度超过1段。
按照https://www.twilio.com/docs/sms/services/smart-encoding-char-list,“标点符号空间”是U+2008。
请注意,Twilio每段收费,所以如果您选择选项2,您将支付更多,因为您将发送更多的片段。
Twilio为您提供了这个工具,以了解您的消息将使用什么编码以及它需要多少段。
https://stackoverflow.com/questions/61891947
复制相似问题