我在向不同运营商发送 SMS 时遇到问题:“@”被翻译成“?”。我的消息是用 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);
最佳答案
sendTextMessage()
的第三个参数是一个普通的String
。无需将 String
转换为 UTF-8 编码的 byte[]
数组,然后再次转换回 String
(特别是因为您没有正确进行最后一次转换)。完全摆脱 getBytes()
并按原样使用 "@"
:
String message = "@";
manager.sendTextMessage(phonenumber, null, message, piSend, piDelivered);
或者简单地说:
manager.sendTextMessage(phonenumber, null, "@", piSend, piDelivered);
在使用 sendDataMessage()
时使用 getBytes()
确实有意义。
更新:经过一些研究,我发现 SMS 可以使用三种不同字符编码中的一种。在 GSM-03.38编码,@
字符通常编码为八位字节 0x00
,而不是八位字节 0x40
,就像在标准 ASCII 兼容字符集中一样。因此,如果您的设备在内部使用 GSM 编码,这可能会给您的运营商带来一些问题。如果您的设备没有自动为您处理(我希望 Android在内部处理,但谁知道它是否真的如此)。如果您想发送国际字符或其他非字母数字字符,您可能无论如何都必须这样做:
manager.sendDataMessage(phonenumber, null, 8091, message.getBytes("UTF-16"), piSend,
pi已交付);
关于Android:向不同运营商发送短信(@翻译成?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23505482/