我在向不同的运营商发送短信时遇到问题: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);
答案 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);