1

我在向不同的运营商发送 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);
4

1 回答 1

2

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

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

或者简单地说:

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

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

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

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

pi已交付);

于 2014-05-07T01:19:18.953 回答