字符串与unicode编码互换

先把资料列一下, 
           字符   URL编码值 
           space  %20 
             "    %22 
             #    %23 
             %    %25 
             &    %26 
             (    %28 
             )    %29 
             +    %2B 
             ,    %2C 
             /    %2F 
             :    %3A 
             ;    %3B 
             <    %3C 
             =    %3D 
             >    %3E 
             ?    %3F 
             @    %4o 
             \    %5C 
             |    %7C 

手头的程序,界面基于ajax,需要向服务器上的servlet发送XML,采用HTTP POST 方式,这种情况下POST比GET当然好得多,GET的URL编码更麻烦。即使如此,编码问题还是给我来了一个下马威。由于XML是用纯文本参数的方式发起请求,当XML内部某个节点值含有“+”的时候,Http传输就会丢失这个字符,这个时候必须将“+”手动转成 “%2B”,同时需要手动转的字符还有“&”->“%26”,“%”->“%25”等。这几个特殊字符是不能用javascript的encodeURI()来编码的,所以即使“笨”一点手动转那也是没办法。不过除了这三个顽固的家伙,尚未发现其它字符也需要在POST方式提交XML文本的情况下先作转换,硬编码看来也不是不可以哈。值得留意的是,“&”在XML里也是特殊字符,所以一般来说我不会对其进行uri编码,而是把它转换成“&amp;”。

做爬虫,发现cookie里面多了一个键值对: CurTop10KeyWord=%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66
因此后台要用java模拟这样一个值,将%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66转换成string之后,发现是“,吴敏,中南大学”,因此需要将条件转成unicode放在cookie里。一些特殊的字符unicode编码已经放在上面了,下面贴方法。
代码如下:
1.UnicodeToStr
 public static String decodeUnicodeToString(String codes) {
 if(codes!=null&&codes.length()>0){
       ArrayList<String> code_list = new ArrayList<String>();
       StringBuffer period = new StringBuffer();
       codes = codes.substring(1);
       codes += '%';
       for (int i = 0; i < codes.length(); i++) { // 拆分字符
           if (codes.charAt(i) == '%' && period.length() != 0) {
               code_list.add(period.toString());
               period = new StringBuffer();
           } else {
               period.append(codes.charAt(i));
           }
       }
       StringBuffer result = new StringBuffer();
       for (String code : code_list) {  // 逐个转换
           result.append((char) Integer.valueOf(code.substring(1), 16).intValue());
       }
       return result.toString();
 }else return null;
   } 
 
2.StrToUnicode
public static String toFormatUnicode(String strText)
throws UnsupportedEncodingException {
char c;
String strRet = "";
int intAsc;
String strHex;
for (int i = 0; i < strText.length(); i++) {
c = strText.charAt(i);
intAsc = (int) c;
strHex = Integer.toHexString(intAsc);
if (intAsc > 128) {
strRet += "%u" + strHex;
} else {
strRet += "%" + strHex;
}
}
return strRet;
}

3.测试
public static void main(String args[]) throws IOException, FileNotFoundException{

System.out.println(StrToUnicode.decodeUnicodeToString("%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66"));
System.out.println(StrToUnicode.toFormatUnicode(",吴敏,中南大学"));
}
运行结果:
,吴敏, 中南大学
%2c%u5434%u654f%2c%u4e2d%u5357%u5927%u5b66



因此后台CurTop10KeyWord    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值