我使用名为Cymba的提供程序发送短信时遇到问题。
基本上我是按照URL编码的规范将消息发布给他们。
然而,当消息发送到我的手机时,£出现前面有A,即£A
现在C#字符串默认是Unicode,所以我切换到ASCII编码,£过来了?。
我尝试从Unicode和ASCII版本开始将消息字符串转换为十六进制(通过此网关,您也可以将消息提交为十六进制)。但是会出现相同的行为。
我怀疑它与字符串编码有关,因为SMS支持7位编码格式:GSM 03.38
我怀疑如果我通过Unicode发送,我只会收到70或140个char消息而不是标准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"); ;
}
答案 0 :(得分:2)
有一个GSM 03.38 to Unicode映射表,它表明£应编码为0x01,因此您可以尝试(只需对其进行一次硬编码)。但是,您应该使用网关运营商检查所有这些内容。网关是否真的希望您使用URL编码的GSM 03.38进行发布?如果是这样,那个映射表可能就是这样 - 你可能需要编写自己的实现来从字符串映射到字节(完全实现System.Text.Encoding
将是过度的)。我首先尝试使用硬编码信息。
答案 1 :(得分:1)
This page包含"7-bit default alphabet"的信息。
最简单的解决方案可能是创建一个字典,将GSM 03.38标准编码的Unicode代码点(大约140个字形)映射为1或2个字节(0x27,0x ??对需要2个字节)。 / p>
一旦完成(取决于您的提供商),您可能还必须将8位字节压缩为7位序列流。这里有一个visual sample。
在你完成了所有这些(并且有几杯啤酒!)后,你可能想把它变成System.Text.Encoding实现。
您可能还希望在CodeProject上查看PDUDecoder以进行相反的操作。还有一个在线版本。
答案 2 :(得分:1)