1

我在使用名为 Cymba 的提供商发送的 SMS 消息时遇到问题。

基本上,我会根据他们的规范 URL 编码将消息发布给他们。

但是,当消息发送到我的手机时,£ 会在前面显示一个 A,即 £A

现在 C# 字符串默认是 Unicode,所以我切换到 ASCII 编码,而 £ 变成了 ?。

我已经尝试将消息字符串转换为从 Unicode 和 ASCII 版本开始的十六进制(因为通过此网关,您也可以将消息提交为十六进制)。然而,同样的行为也会发生。

我怀疑这与字符串编码有关,因为 SMS 支持 7 位编码格式:GSM 03.38

我还怀疑,如果我通过 Unicode 发送,我只会收到 70 或 140 字符的消息,而不是标准的 160。

我对 SMS 发送很陌生,因此我们将不胜感激任何帮助或建议。

所以问题是,我怎样才能让我的 C# 字符串变成这种格式?

更新:看起来网关的问题不是我的代码,因为我尝试用 7 位等效十六进制值替换有问题的 £,但这也不起作用。请参阅下面的我的测试代码,这可能会在未来帮助其他人:

byte pound = 0xA3;
byte GSMPound = 0x01;
string hexxedMsg = "";
System.Text.UnicodeEncoding encoder = new System.Text.UnicodeEncoding();
byte[] msgBytes = encoder.GetBytes(message);

foreach (byte byt in msgBytes)
{
    if(byt == pound)
        hexxedMsg += GSMPound.ToString("X");
    else
        hexxedMsg += byt.ToString("X2"); ;
}
4

3 回答 3

2

有一个可用的GSM 03.38 到 Unicode映射表,这表明 £ 应该被编码为 0x01,所以你可以尝试(只需硬编码一次尝试)。但是,您真的应该向网关运营商检查所有这些。网关是否真的希望您以 URL 编码的 GSM 03.38 发布?如果是这样,那么该映射表可能是要走的路 - 您可能需要编写自己的实现以从字符串映射到字节(完全实现System.Text.Encoding将是矫枉过正)。不过,我会先尝试使用硬编码消息。

于 2009-03-27T17:55:44.063 回答
1

此页面包含有关“7 位默认字母表”的信息。

最简单的解决方案可能是创建一个字典,将由 GSM 03.38 标准编码的 Unicode 代码点(大约 140 个字形)映射为 1 或 2 个字节(0x27、0x?? 对需要 2 个字节)。

一旦完成(取决于您的提供商),您可能还必须将 8 位字节压缩成 7 位序列流。这里有一个视觉样本

在你完成了所有这些(并且喝了几杯啤酒!)之后,你可能想把它变成一个 System.Text.Encoding 实现。


您可能还想查看CodeProject 上的PDUDecoder以进行反向操作。还有一个在线版本。

于 2009-03-27T18:02:13.860 回答
1

你应该看看这个:https ://github.com/mediaburst/.NET-GSM-Encoding/blob/master/GSMEncoding.cs

于 2013-01-16T00:55:48.323 回答