title: Android: Unicode/Charset problems when sending an SMS (sendTextMessage)
body: <p>Basically I have a working application that sends an SMS after receiving an SMS.</p>
  
  <p><strong>Everything works fine</strong>, except when the SMS text <strong>to send</strong> has "special chars", ie "é,à,í,ç", etc.</p>
  
  <p>I've tried many things including charset conversion but I simply can't make it work... the msgText always comes back with charset encoding problems.</p>
  
  <p>Here's the part where the message is sent:</p>
  
  <pre><code>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();
      }
  }</code></pre>
  
  <p>Here's the charset conversion function I tried (but didn't help), that I applied on msgText:</p>
  
  <pre><code>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;
  }</code></pre>
  
  <p>Near desperation I even tried the solution for unicode messaging in here (didn't help as well):</p>
  
  <p><a href="http://since2006.com/blog/android-send-unicode-message/" rel="noreferrer"><a href="http://since2006.com/blog/android-send-unicode-message/" rel="noreferrer">http://since2006.com/blog/android-send-unicode-message/</a></a></p>
  
  <p>Anyway, here's the (cleaned up - package is com.THE.APPLICATION, main activity is MAINACT) LogCat for when it crashes (when trying to send the message, after receiving one):</p>
  
  <pre>WARN/dalvikvm(28218): threadid=1: thread exiting with uncaught exception (group=0x4001d7f0)
  ERROR/AndroidRuntime(28218): FATAL EXCEPTION: main
  ERROR/AndroidRuntime(28218): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.provider.Telephony.SMS_RECEIVED (has extras) } in com.THE.APPLICATION.SMSReceiver@44acd880
  ERROR/AndroidRuntime(28218):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:905)
  ERROR/AndroidRuntime(28218):     at android.os.Handler.handleCallback(Handler.java:587)
  ERROR/AndroidRuntime(28218):     at android.os.Handler.dispatchMessage(Handler.java:92)
  ERROR/AndroidRuntime(28218):     at android.os.Looper.loop(Looper.java:123)
  ERROR/AndroidRuntime(28218):     at android.app.ActivityThread.main(ActivityThread.java:4627)
  ERROR/AndroidRuntime(28218):     at java.lang.reflect.Method.invokeNative(Native Method)
  ERROR/AndroidRuntime(28218):     at java.lang.reflect.Method.invoke(Method.java:521)
  ERROR/AndroidRuntime(28218):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  ERROR/AndroidRuntime(28218):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  ERROR/AndroidRuntime(28218):     at dalvik.system.NativeStart.main(Native Method)
  ERROR/AndroidRuntime(28218): Caused by: java.lang.NullPointerException
  ERROR/AndroidRuntime(28218):     at android.os.Parcel.readException(Parcel.java:1253)
  ERROR/AndroidRuntime(28218):     at android.os.Parcel.readException(Parcel.java:1235)
  ERROR/AndroidRuntime(28218):     at com.android.internal.telephony.ISms$Stub$Proxy.sendText(ISms.java:369)
  ERROR/AndroidRuntime(28218):     at 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)
  ERROR/AndroidRuntime(28218):     at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:892)
  ERROR/AndroidRuntime(28218):     ... 9 more
  </pre>
  
  <p>Sample of message text to send with issues:</p>
  
  <pre>VERBOSE/debug_tag(28218): msgText is: possÃ­vel.</pre>
  
  <p>So, it <em>reads</em> <strong>possÃ­vel</strong> when it should <em>be</em> <strong>possível</strong></p>
  
  <p>Please some enlightened soul help me out. He/She'll have a special place in my heart! :)</p>
  
  <p>Edit: If the special place in my heart doesn't cut it, I'm willing to pay a few bucks for a working solution...</p>