【发布时间】:2016-03-04 13:24:04
【问题描述】:
我正在编写一个 BroadcastReceiver 来接收 SMS 消息。我需要将消息与用户在设置中设置的字符串进行比较,但该字符串可以是非 ASCII。以下代码仅适用于仅包含 ASCII 字符的 SMS-es。如何将消息转换为 UTF8 编码?
public class SmsReceiver extends BroadcastReceiver {
final static String TAG = "SmsReceiver";
public SmsReceiver() {
}
@Override
public void onReceive(final Context context, final Intent intent) {
final Bundle bundle = intent.getExtras();
try {
if (bundle != null) {
final Object[] pdusObj = (Object[]) bundle.get("pdus");
for (int i = 0; i < pdusObj.length; i++) {
final SmsMessage currentMessage = SmsMessage.createFromPdu((byte[]) pdusObj[i]);
final String senderNum = currentMessage.getDisplayOriginatingAddress();
final String message = currentMessage.getDisplayMessageBody();
Log.i(TAG, "senderNum: " + senderNum + "; message: " + message);
更新:
似乎相同的代码可以在我的 Nexus5 上运行,但在 API 10 的模拟器中不起作用。
我发的短信:שלום
收到的短信:éRΨ¿Ñ u$
【问题讨论】:
-
为什么要使用 UTF-8? Java 不对字符串使用 UTF-8。使用非 ASCII 字符时什么不起作用?
-
当我从一个模拟器向另一个模拟器发送短信并将消息打印到日志(我的代码中的最后一行)时,消息是“垃圾”。另请参阅我的更新
-
听起来这只是你的记录器。请显示“垃圾”日志行,可能还有字符串的 UTF-16 十六进制编码
-
好吧,看起来它不是记录器,但旧的(API 10)模拟器有一些错误,因为现在我在 Message 应用程序中查看了 SMS,它们的显示与我的应用程序。
-
好的,那么“垃圾”是什么样的,原始字符串是什么?
标签: android utf-8 character-encoding broadcastreceiver sms