Android:发送短信时的Unicode /字符集问题(sendTextMessage)

基本上我有一个工作的应用程序,收到短信后发送短信。

一切工作正常 ,除了当发送短信文本“特殊字符”,即“é,à,í,ç”等

我已经尝试了很多东西,包括字符集转换,但我根本无法使它工作… msgText总是带着字符集编码问题。

以下是发送消息的部分:

if (msgText.length() > 160) { ArrayList msgTexts = sm.divideMessage(msgText); sm.sendMultipartTextMessage(PhoneNumber, null, msgTexts, null, null); } else { try { sm.sendTextMessage(PhoneNumber, null, msgText, null, null); } catch (IllegalArgumentException e) { e.printStackTrace(); } } 

这里是我尝试过的字符集转换函数(但没有帮助),我申请了msgText:

 public static String formatCharset(String txtInicial) { //-- Please notice this is just for reference, I tried every charset from/to conversion possibility. Even stupid ones and nothing helped. /*try {//-- Seems simpler, it should do the same as below, but didn't help msgText = new String(msgText.getBytes("UTF-8"), "ISO-8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }*/ Charset charsetOrigem = Charset.forName("UTF-8"); CharsetEncoder encoderOrigem = charsetOrigem.newEncoder(); Charset charsetDestino = Charset.forName("ISO-8859-1"); CharsetDecoder decoderDestino = charsetDestino.newDecoder(); String txtFinal = ""; try { ByteBuffer bbuf = encoderOrigem.encode(CharBuffer.wrap( txtInicial )); CharBuffer cbuf = decoderDestino.decode(bbuf); txtFinal = cbuf.toString(); } catch (CharacterCodingException e) { e.printStackTrace(); } if (txtFinal.length() == 0) txtFinal = txtInicial; return txtFinal; } 

近乎绝望,我甚至在这里尝试了unicode消息传递的解决scheme(并没有帮助):

http://since2006.com/blog/android-send-unicode-message/

无论如何,这里(清理 – 包是com.THE.APPLICATION,主要活动是MAINACT)LogCat当它崩溃时(当试图发送消息,收到之后):

  WARN / dalvikvm(28218):threadid = 1:线程退出与未捕获的exception(组= 0x4001d7f0)
错误/ AndroidRuntime(28218):致命的例外:主
 ERROR / AndroidRuntime(28218):java.lang.RuntimeException:在com.THE.APPLICATION.SMSReceiver@44acd880中接收广播Intent {act = android.provider.Telephony.SMS_RECEIVED(has extras)}时出错
错误/ AndroidRuntime(28218):在android.app.ActivityThread $ PackageInfo $ ReceiverDispatcher $ Args.run(ActivityThread.java:905)
错误/ AndroidRuntime(28218):在android.os.Handler.handleCallback(Handler.java:587)
错误/ AndroidRuntime(28218):在android.os.Handler.dispatchMessage(Handler.java:92)
错误/ AndroidRuntime(28218):在android.os.Looper.loop(Looper.java:123)
错误/ AndroidRuntime(28218):在android.app.ActivityThread.main(ActivityThread.java:4627)
 ERROR / AndroidRuntime(28218):在java.lang.reflect.Method.invokeNative(Native方法)
 ERROR / AndroidRuntime(28218):在java.lang.reflect.Method.invoke(Method.java:521)
错误/ AndroidRuntime(28218):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
错误/ AndroidRuntime(28218):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 ERROR / AndroidRuntime(28218):at dalvik.system.NativeStart.main(Native Method)
错误/ AndroidRuntime(28218):引起:java.lang.NullPointerException
错误/ AndroidRuntime(28218):在android.os.Parcel.readException(Parcel.java:1253)
错误/ AndroidRuntime(28218):在android.os.Parcel.readException(Parcel.java:1235)
错误/ AndroidRuntime(28218):在com.android.internal.telephony.ISms $存根$ Proxy.sendText(ISms.java:369)
错误/ AndroidRuntime(28218):在android.telephony.SmsManager.sendTextMessage(SmsManager.java:87)
 ERROR / AndroidRuntime(28218):at com.THE.APPLICATION.MAINACT.sendMessage(MAINACT.java:214)
 ERROR / AndroidRuntime(28218):at com.THE.APPLICATION.SMSReceiver.onReceive(SMSReceiver.java:24)
错误/ AndroidRuntime(28218):在android.app.ActivityThread $ PackageInfo $ ReceiverDispatcher $ Args.run(ActivityThread.java:892)
错误/ AndroidRuntime(28218):... 9更多

要发送的消息文本示例:

  VERBOSE / debug_tag(28218):msgText是:possÃvel。 

所以,它应该possível 读取 possÃvel

请一些开明的灵魂帮助我。 他/她会在我心中有一个特别的地方! 🙂

编辑:如果我心中的特殊地方不削减它,我愿意付出几个工作解决scheme的钱…

Solutions Collecting From Web of "Android:发送短信时的Unicode /字符集问题(sendTextMessage)"

好吧,这似乎已经解决了简单地使用sendMultipartTextMessage而不是sendTextMessage消息。

谁会想到…这是有道理的,因为Unicode字符比“正常”字符使用更多的“空间”。

我已经使用此代码将UTF-8字符转换为ASCII。 然后发送短信的作品,我可以使用160个字符:

 private static final String PLAIN_ASCII = "AaEeIiOoUu" // grave + "AaEeIiOoUuYy" // acute + "AaEeIiOoUuYy" // circumflex + "AaOoNn" // tilde + "AaEeIiOoUuYy" // umlaut + "Aa" // ring + "Cc" // cedilla + "OoUu" // double acute ; private static final String UNICODE = "\u00C0\u00E0\u00C8\u00E8\u00CC\u00EC\u00D2\u00F2\u00D9\u00F9" + "\u00C1\u00E1\u00C9\u00E9\u00CD\u00ED\u00D3\u00F3\u00DA\u00FA\u00DD\u00FD" + "\u00C2\u00E2\u00CA\u00EA\u00CE\u00EE\u00D4\u00F4\u00DB\u00FB\u0176\u0177" + "\u00C3\u00E3\u00D5\u00F5\u00D1\u00F1" + "\u00C4\u00E4\u00CB\u00EB\u00CF\u00EF\u00D6\u00F6\u00DC\u00FC\u0178\u00FF" + "\u00C5\u00E5" + "\u00C7\u00E7" + "\u0150\u0151\u0170\u0171"; // remove accentued from a string and replace with ascii equivalent public static String convertNonAscii(String s) { if (s == null) return null; StringBuilder sb = new StringBuilder(); int n = s.length(); for (int i = 0; i < n; i++) { char c = s.charAt(i); int pos = UNICODE.indexOf(c); if (pos > -1) { sb.append(PLAIN_ASCII.charAt(pos)); } else { sb.append(c); } } return sb.toString(); } 

我正在使用这个命令行:

 Html.fromHtml(new String(myString.getBytes("UTF-8"))).toString(); 

和我的短信看起来很完美。

如果是7位编码,只能使用160个字符。 如果您使用140个字符,则应使用sendMultipartTextMessage,因为您使用的是8位字符(UTF-8)。

我有与特殊字符相同的问题。 当我将消息MAX_SMS_MESSAGE_LENGTH更改为70时,一切正常。 看那个链接:

https://forums.macrumors.com/threads/special-characters-in-sms-turn-them-shorter-70-characters-old-issue-never-solved.1030577/

这是我的代码:

  public static void sendSMS(String phoneNumber, String message, Context context) { String SENT = "SMS_SENT"; int MAX_SMS_MESSAGE_LENGTH = 70; SmsManager smsManager = SmsManager.getDefault(); PendingIntent sentPI; sentPI = PendingIntent.getBroadcast(context, 0,new Intent(SENT), 0); try { if(message.length() > MAX_SMS_MESSAGE_LENGTH) { ArrayList<String> messageList = SmsManager.getDefault().divideMessage(message); smsManager.sendMultipartTextMessage(phoneNumber, null, messageList, null, null); } else { smsManager.sendTextMessage(phoneNumber, null, message, sentPI, null); } } catch (Exception e) { Log.e("SmsProvider", "" + e); } } 

当然,你可以插入一个控制器来检查消息是否包含特殊字符,然后将MAX_SMS_MESSAGE_LENGTH从160改为70.我的应用程序中总是有特殊字符。