【问题标题】:Receive an read SMS with correct encoding and convert to UTF8接收具有正确编码的读取短信并转换为 UTF8
【发布时间】: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


【解决方案1】:

作为记录,如果其他人遇到类似的问题,这似乎是模拟器中的一个错误。我为安卓模拟器开了一张票: https://code.google.com/p/android/issues/detail?id=202723

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2018-08-28
    • 2015-09-19
    相关资源
    最近更新 更多