Unicode转UTF-8(安卓android)

今天在使用一个【手机号码归属地api】的时候,返回值里中文是Unicode格式,样子是这样的:

[java]  view plain  copy
  1. "province":"\u9ed1\u9f99\u6c5f","city":"\u7261\u4e39\u6c5f"  
我们的目标是转换成可使用的UTF-8形式,我百度到了两种方法:

第一种方法很丑:
[java]  view plain  copy
  1. /** 
  2.  * 这个方法乍一看我尼玛太丑了,可是比下面的方法 好用! 
  3.  * 
  4.  * @param theString 
  5.  * @return 
  6.  */  
  7. public static String decodeUnicode(String theString) {  
  8.     char aChar;  
  9.     int len = theString.length();  
  10.     StringBuffer outBuffer = new StringBuffer(len);  
  11.     for (int x = 0; x < len; ) {  
  12.         aChar = theString.charAt(x++);  
  13.         if (aChar == '\\') {  
  14.             aChar = theString.charAt(x++);  
  15.             if (aChar == 'u') {  
  16.                 // Read the xxxx  
  17.                 int value = 0;  
  18.                 for (int i = 0; i < 4; i++) {  
  19.                     aChar = theString.charAt(x++);  
  20.                     switch (aChar) {  
  21.                         case '0':  
  22.                         case '1':  
  23.                         case '2':  
  24.                         case '3':  
  25.                         case '4':  
  26.                         case '5':  
  27.                         case '6':  
  28.                         case '7':  
  29.                         case '8':  
  30.                         case '9':  
  31.                             value = (value << 4) + aChar - '0';  
  32.                             break;  
  33.                         case 'a':  
  34.                         case 'b':  
  35.                         case 'c':  
  36.                         case 'd':  
  37.                         case 'e':  
  38.                         case 'f':  
  39.                             value = (value << 4) + 10 + aChar - 'a';  
  40.                             break;  
  41.                         case 'A':  
  42.                         case 'B':  
  43.                         case 'C':  
  44.                         case 'D':  
  45.                         case 'E':  
  46.                         case 'F':  
  47.                             value = (value << 4) + 10 + aChar - 'A';  
  48.                             break;  
  49.                         default:  
  50.                             throw new IllegalArgumentException(  
  51.                                     "Malformed   \\uxxxx   encoding.");  
  52.                     }  
  53.   
  54.                 }  
  55.                 outBuffer.append((char) value);  
  56.             } else {  
  57.                 if (aChar == 't')  
  58.                     aChar = '\t';  
  59.                 else if (aChar == 'r')  
  60.                     aChar = '\r';  
  61.                 else if (aChar == 'n')  
  62.                     aChar = '\n';  
  63.                 else if (aChar == 'f')  
  64.                     aChar = '\f';  
  65.                 outBuffer.append(aChar);  
  66.             }  
  67.         } else  
  68.             outBuffer.append(aChar);  
  69.     }  
  70.     return outBuffer.toString();  
  71. }  

第二种方法很好看:

[java]  view plain  copy
  1. /** 
  2.  * 这个方法,看着爽,效率低(时间长,耗内存) 
  3.  * 
  4.  * @param text 
  5.  * @return 
  6.  */  
  7. public static String unicode2Utf8(String text) {  
  8.     try {  
  9.         byte[] converttoBytes = text.getBytes("UTF-8");  
  10.         String s2 = new String(converttoBytes, "UTF-8");  
  11.         return s2;  
  12.     } catch (Exception e) {  
  13.         e.printStackTrace();  
  14.         return e.getMessage();  
  15.     }  
  16. }  
想必看我的注解也能知道它俩的优劣了。就好比一个外表好看内心一般的女人,和一个外表一般心灵美丽的女人。最后我选择了后者。
说下我的理由吧,写了一段测试方法:
[java]  view plain  copy
  1. private void test(){  
  2.     String text = "\u5e7f\u5c9b\u4e4b\u604b.mp3";  
  3.     long beginTime1 = System.currentTimeMillis() ;  
  4.     Log.i("方法一""开始");  
  5.     for (double i=0; i<25000;i++){  
  6.         Util.decodeUnicode(text);  
  7.     }  
  8.     Log.i("方法一""共耗时:"+(System.currentTimeMillis()-beginTime1));  
  9.   
  10.     long beginTime2 = System.currentTimeMillis() ;  
  11.     Log.i("方法二""开始");  
  12.     for (double i=0; i<25000;i++){  
  13.         Util.unicode2Utf8(text);  
  14.     }  
  15.     Log.i("方法二""共耗时:" + (System.currentTimeMillis() - beginTime2));  
  16. }  
我们每种方法跑25000次,并且打印了两种方法的耗时,我们来看结果:

方法二不仅耗时长,而且进行了4次GC。结果不言而喻吧。 Way One Win !!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值