Android:向不同的运营商发送短信(@被翻译为?)

时间:2014-05-06 22:19:17

标签: android unicode sms gsm smsmanager

我在向不同的运营商发送短信时遇到问题:a" @"被翻译为"?"。我的消息是用UTF-8编码的,我使用这段代码:

SmsManager manager = SmsManager.getDefault();   
PendingIntent piSend = PendingIntent.getBroadcast(this, 0, new Intent(SMS_SENT), 0);
PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(SMS_DELIVERED), 0);

String message = new String(new String("@").getBytes("UTF-8"))
manager.sendTextMessage(phonenumber, null,  message , piSend, piDelivered);

谢谢!

注意:

我尝试使用下面的代码,但我遇到了问题。在Windows Phone 8等操作系统上,SMS永远不会发送。

manager.sendDataMessage(phonenumber, null, (short) 8091, message.getBytes(), piSend,     
piDelivered);

1 个答案:

答案 0 :(得分:2)

sendTextMessage()的第三个参数是普通String。无需将String转换为UTF-8编码的byte[]数组,然后再转换回String(特别是因为您没有正确执行上一次转换)。完全摆脱getBytes()并按原样使用"@"

String message = "@";
manager.sendTextMessage(phonenumber, null, message, piSend, piDelivered);

或者简单地说:

manager.sendTextMessage(phonenumber, null, "@", piSend, piDelivered);

使用getBytes()时使用sendDataMessage()确实有意义。

更新:做一些研究,我发现短信可以使用三种不同的字符编码之一。在GSM-03.38编码中,@字符通常编码为八位字节0x00,而不是像标准ASCII兼容字符集中的八位字节0x40。因此,如果您的设备在内部使用GSM编码,这可能会给您的运营商带来一些问题。你可能不得不使用sendDataMessage()代码,这样你就可以将String数据编码为UTF-16,如果你的设备没有自动为你处理(我希望Android在内部处理,但谁知道如果确实如此)。如果您想发送国际或其他非字母数字字符,您可能必须这样做:

manager.sendDataMessage(phonenumber, null, 8091, message.getBytes("UTF-16"), piSend,     

piDelivered);