emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks
java版本的escape和unescape函数

 

class  EscapeUnescape
{
 public static String  escape (String src)
 {
  int i;
  char j;
  StringBuffer tmp = new StringBuffer();
  tmp.ensureCapacity(src.length()*6);

  for (i=0;i<src.length() ;i++ )
  {

   j = src.charAt(i);

   if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
    tmp.append(j);
   else
    if (j<256)
    {
    tmp.append( "%" );
    if (j<16)
     tmp.append( "0" );
    tmp.append( Integer.toString(j,16) );
    }
    else
    {
    tmp.append( "%u" );
    tmp.append( Integer.toString(j,16) );
    }
  }
  return tmp.toString();
 }

 public static String  unescape (String src)
 {
  StringBuffer tmp = new StringBuffer();
  tmp.ensureCapacity(src.length());
  int  lastPos=0,pos=0;
  char ch;
  while (lastPos<src.length())
  {
   pos = src.indexOf("%",lastPos);
   if (pos == lastPos)
    {
    if (src.charAt(pos+1)=='u')
     {
     ch = (char)Integer.parseInt(src.substring(pos+2,pos+6),16);
     tmp.append(ch);
     lastPos = pos+6;
     }
    else
     {
     ch = (char)Integer.parseInt(src.substring(pos+1,pos+3),16);
     tmp.append(ch);
     lastPos = pos+3;
     }
    }
   else
    {
    if (pos == -1)
     {
     tmp.append(src.substring(lastPos));
     lastPos=src.length();
     }
    else
     {
     tmp.append(src.substring(lastPos,pos));
     lastPos=pos;
     }
    }
  }
  return tmp.toString();
 }

 public static void main(String[] args)
 {
  String tmp="~!@#$%^&*()_+|\\=-,./?><;'][{}\"";
  System.out.println("testing escape : "+tmp);
  tmp =escape(tmp);
  System.out.println(tmp);
  System.out.println("testing unescape :"+tmp);
  System.out.println(unescape(tmp));
 }
}

posted on 2005-05-18 16:14 emu 阅读(25566) 评论(17)  编辑  收藏 所属分类: java技术

评论

# re: java版本的escape和unescape函数 2006-01-06 08:27 Fallingdown
Good job!  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-01-06 20:07 cm4ever
用java.net.Decoder这个类不行?  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-01-06 22:18 emu
楼上说的是否是 java.net.URLDecoder / java.net.URLEncoder
这两个方法对应的是javascript的 encodeURI/decodeURI 和 encodeURIComponent/decodeURIComponent 吧?
我写的两个方法对应的是javascript 的escape/unescape  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-01-07 00:42 cm4ever
恩,明白你的意思了。不错不错。  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-02-08 11:23 tsroom
好用,不过有没有官方版本的标准类库?
还有,我在客户端用java script 的escape处理的中文字段,怎么在request.getParamete取得不是乱码也是null值呢?英文可以。
  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-02-08 12:30 emu
官方版本的标准类库也是人写的。除非在虚拟机内部提供支持,否则他恐怕也只能做到这样了。  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-02-27 14:44 javadolt
我escape后传过去的参数为NULL,而不进行escape传过去中文乱码。我是用 http_request.send(data);传送数据过去的。
如果直接在url后面加?test=中文,这个没问题,把ISO-8859-1转为GBK就可以了。  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-02-27 17:13 emu
escape后获得null估计是因为参数名也被escape了,要不然就是?或者=或者&这几个url的保留字符也被escape了。
比如
?test=%u4E2D%u6587应该是没有问题的
但是
?test%3D%u4E2D%u6587 肯定就不行了
%3Ftest=%u4E2D%u6587 肯定也不对
%3Ftest%3D%u4E2D%u6587 这就更不要说了。
你是那种情形?
  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-02-28 15:50 howard123456
我也遇到escape以后参数值是null的情况了,可是我的参数名称以及保留字符没有被escape,:(  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-02-28 20:28 emu
呵呵那就是用了send(data)方式post数据了吧,这就说来话长了。
post数据的时候数据是自动按照utf-8编码的,但是也接受urlencode方式编码的二进制数据。注意到urlencode的转义符和escape是一样的:%,但是他们代表的意思不同。urlencode的%XX代表的是XX这个16进制数字的数据,而escape的%XX代表的是ASCII码为XX的一个字符(%uXXXX则代表Unicode码为XXXX的一个unicode字符)。乱码就此产生。  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-03-07 14:23 javadolt
@emu
呵呵那就是用了send(data)方式post数据了吧,这就说来话长了。 ……

请问,那如何解决这种乱码呢,谢谢?  回复  更多评论
  

# re: java版本的escape和unescape函数 2006-03-23 11:29 emu
网页端需要urlencode编码的时候,我们一般用vbs编码,网上现成的代码很多了。
在不能用vbs(非IE浏览器)或者非简体中文操作系统上,可以用字典法编码,参见:
http://www.blogjava.net/emu/articles/31756.html  回复  更多评论
  

# re: java版本的escape和unescape函数 2008-11-13 21:44 云涛
哥们,不错!  回复  更多评论
  

# re: java版本的escape和unescape函数 2010-02-06 21:49 seeeyou
工作中一个问题 靠这个解决了 多谢  回复  更多评论
  

# re: java版本的escape和unescape函数 2011-09-28 13:36 ll987_
感谢!  回复  更多评论
  

# re: java版本的escape和unescape函数 2012-03-10 14:15 李世荣
楼主很强大,我成功的用这个解决了前台传后台乱码的问题,今天可以早点儿下班回家了  回复  更多评论
  

# re: java版本的escape和unescape函数 [未登录] 2013-04-08 13:26 冬日的阳光
这个的确可以用,太谢谢楼主了,帮了我大忙啊,谢谢  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: