注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

java中unicode码转中文  

2012-12-08 17:49:13|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        最近做项目,要把unicode转为中文,但是本身取出来的时候unicode码已经被转为“\\u6211”了,无法用java默认的转码来转换了。

        自己写了一个转换器,根据unicode转码的规律,之后遇到了不少麻烦,例如如果以“\\u”开头但是根本不是unicode码、末尾以“\\”结尾啊什么的。目前是把程序完成为能想到的出错的可能性都覆盖了,以后再碰到再修改。

Java代码 
  1. public class UnicodeDecoder {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String s = "\\\u6211\\uadsf\\t\\u7231\u5317\\u4EAC\u5929\\u5B\t89\\\t\u95E8\\\"\\u12";  
  5.         System.out.println(decode(s));  
  6.     }  
  7.   
  8.     public static String decode(String in) {  
  9.         try {  
  10.             return decode(in.toCharArray());  
  11.         } catch (Exception e) {  
  12.             e.printStackTrace();  
  13.         }  
  14.         return in;  
  15.     }  
  16.   
  17.     private static String decode(char[] in) throws Exception {  
  18.         int off = 0;  
  19.         char c;  
  20.         char[] out = new char[in.length];  
  21.         int outLen = 0;  
  22.         while (off < in.length) {  
  23.             c = in[off++];  
  24.             if (c == '\\') {  
  25.                 if (in.length > off) { // 是否有下一个字符  
  26.                     c = in[off++]; // 取出下一个字符  
  27.                 } else {  
  28.                     out[outLen++] = '\\'; // 末字符为'\',返回  
  29.                     break;  
  30.                 }  
  31.                 if (c == 'u') { // 如果是"\\u"  
  32.                     int value = 0;  
  33.                     if (in.length > off + 4) { // 判断"\\u"后边是否有四个字符  
  34.                         boolean isUnicode = true;  
  35.                         for (int i = 0; i < 4; i++) { // 遍历四个字符  
  36.                             c = in[off++];  
  37.                             switch (c) {  
  38.                             case '0':  
  39.                             case '1':  
  40.                             case '2':  
  41.                             case '3':  
  42.                             case '4':  
  43.                             case '5':  
  44.                             case '6':  
  45.                             case '7':  
  46.                             case '8':  
  47.                             case '9':  
  48.                                 value = (value << 4) + c - '0';  
  49.                                 break;  
  50.                             case 'a':  
  51.                             case 'b':  
  52.                             case 'c':  
  53.                             case 'd':  
  54.                             case 'e':  
  55.                             case 'f':  
  56.                                 value = (value << 4) + 10 + c - 'a';  
  57.                                 break;  
  58.                             case 'A':  
  59.                             case 'B':  
  60.                             case 'C':  
  61.                             case 'D':  
  62.                             case 'E':  
  63.                             case 'F':  
  64.                                 value = (value << 4) + 10 + c - 'A';  
  65.                                 break;  
  66.                             default:  
  67.                                 isUnicode = false// 判断是否为unicode码  
  68.                             }  
  69.                         }  
  70.                         if (isUnicode) { // 是unicode码转换为字符  
  71.                             out[outLen++] = (char) value;  
  72.                         } else { // 不是unicode码把"\\uXXXX"填入返回值  
  73.                             off = off - 4;  
  74.                             out[outLen++] = '\\';  
  75.                             out[outLen++] = 'u';  
  76.                             out[outLen++] = in[off++];  
  77.                         }  
  78.                     } else { // 不够四个字符则把"\\u"放入返回结果并继续  
  79.                         out[outLen++] = '\\';  
  80.                         out[outLen++] = 'u';  
  81.                         continue;  
  82.                     }  
  83.                 } else {  
  84.                     switch (c) { // 判断"\\"后边是否接特殊字符,回车,tab一类的  
  85.                     case 't':  
  86.                         c = '\t';  
  87.                         out[outLen++] = c;  
  88.                         break;  
  89.                     case 'r':  
  90.                         c = '\r';  
  91.                         out[outLen++] = c;  
  92.                         break;  
  93.                     case 'n':  
  94.                         c = '\n';  
  95.                         out[outLen++] = c;  
  96.                         break;  
  97.                     case 'f':  
  98.                         c = '\f';  
  99.                         out[outLen++] = c;  
  100.                         break;  
  101.                     default:  
  102.                         out[outLen++] = '\\';  
  103.                         out[outLen++] = c;  
  104.                         break;  
  105.                     }  
  106.                 }  
  107.             } else {  
  108.                 out[outLen++] = (char) c;  
  109.             }  
  110.         }  
  111.         return new String(out, 0, outLen);  
  112.     }  
  113. }  
  评论这张
 
阅读(584)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016