栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 中类似js encodeURIComponent 函数的实现案例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 中类似js encodeURIComponent 函数的实现案例

我就废话不多说了,大家还是直接看代码吧~

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
 

public class EncodingUtil {
 
 public static String decodeURIComponent(String s) {
  if (s == null) {
   return null;
  }
 
  String result = null;
 
  try {
   result = URLDecoder.decode(s, "UTF-8");
  }
 
  // This exception should never occur.
  catch (UnsupportedEncodingException e) {
   result = s; 
  }
 
  return result;
 }
 
 
 public static String encodeURIComponent(String s) {
  String result = null;
 
  try {
   result = URLEncoder.encode(s, "UTF-8")
      .replaceAll("\+", "%20")
      .replaceAll("\%21", "!")
      .replaceAll("\%27", "'")
      .replaceAll("\%28", "(")
      .replaceAll("\%29", ")")
      .replaceAll("\%7E", "~");
  }
 
  // This exception should never occur.
  catch (UnsupportedEncodingException e) {
   result = s;
  }
 
  return result;
 } 
 
 
 private EncodingUtil() {
  super();
 }
}

补充知识:java 代码实现encodeURIComponent和decodeURIComponent,解决空格转义为加号的问题

java自带有一个 java.net.URLDecoder和java.net.URLEncoder。

通过这两个类,可以调用encode()或者decode()方法对字符串进行URL编码。

那既然有了,为什么还要自己实现一套呢?主要原因是Jdk中并没有提供encodeURIComponent和decodeURIComponent的方法。

这两个方法作用其实跟encode()和decode()基本相似。区别主要是,在java中,url编码时,会把空格转换成+号。而某些非java语言实现的客户端一般空格转义出来是 %20 ,这样就容易发生decode不出这个空格的问题。比如IOS中,会把这个+直接显示了,而不是转义成空格。这就跟我们想要的结果违背了。比如js中就自带有encodeURIComponent和decodeURIComponent的方法。

java我们就自己实现一下吧。直接看代码,一看就明白。

 
 
import java.io.UnsupportedEncodingException; 
public class URIEncoder
{ 
  public static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";
 
  
  public static String encodeURI(String str)
    throws UnsupportedEncodingException
  {
    String isoStr = new String(str.getBytes("UTF8"), "ISO-8859-1");
    char[] chars = isoStr.toCharArray();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < chars.length; i++ )
    {
      if ((chars[i] <= 'z' && chars[i] >= 'a') || (chars[i] <= 'Z' && chars[i] >= 'A')
 || chars[i] == '-' || chars[i] == '_' || chars[i] == '.' || chars[i] == '!'
 || chars[i] == '~' || chars[i] == '*' || chars[i] == ''' || chars[i] == '('
 || chars[i] == ')' || chars[i] == ';' || chars[i] == '/' || chars[i] == '?'
 || chars[i] == ':' || chars[i] == '@' || chars[i] == '&' || chars[i] == '='
 || chars[i] == '+' || chars[i] == '$' || chars[i] == ',' || chars[i] == '#'
 || (chars[i] <= '9' && chars[i] >= '0'))
      {
 sb.append(chars[i]);
      }
      else
      {
 sb.append("%");
 sb.append(Integer.toHexString(chars[i]));
      }
    }
    return sb.toString();
  }
 
  
  public static String encodeURIComponent(String input)
  {
    if (null == input || "".equals(input.trim()))
    {
      return input;
    }
 
    int l = input.length();
    StringBuilder o = new StringBuilder(l * 3);
    try
    {
      for (int i = 0; i < l; i++ )
      {
 String e = input.substring(i, i + 1);
 if (ALLOWED_CHARS.indexOf(e) == -1)
 {
   byte[] b = e.getBytes("utf-8");
   o.append(getHex(b));
   continue;
 }
 o.append(e);
      }
      return o.toString();
    }
    catch (UnsupportedEncodingException e)
    {
      e.printStackTrace();
    }
    return input;
  }
 
  private static String getHex(byte buf[])
  {
    StringBuilder o = new StringBuilder(buf.length * 3);
    for (int i = 0; i < buf.length; i++ )
    {
      int n = (int)buf[i] & 0xff;
      o.append("%");
      if (n < 0x10)
      {
 o.append("0");
      }
      o.append(Long.toString(n, 16).toUpperCase());
    }
    return o.toString();
  }
}

 
package com.poly.rbl.plugin.uri; 
public class URIDecoder
{ 
  
  public static String decodeURIComponent(String encodedURI)
  {
    char actualChar;
 
    StringBuffer buffer = new StringBuffer();
 
    int bytePattern, sumb = 0;
 
    for (int i = 0, more = -1; i < encodedURI.length(); i++ )
    {
      actualChar = encodedURI.charAt(i);
 
      switch (actualChar)
      {
 case '%':
 {
   actualChar = encodedURI.charAt(++i);
   int hb = (Character.isDigit(actualChar) ? actualChar - '0' : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
   actualChar = encodedURI.charAt(++i);
   int lb = (Character.isDigit(actualChar) ? actualChar - '0' : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
   bytePattern = (hb << 4) | lb;
   break;
 }
 case '+':
 {
   bytePattern = ' ';
   break;
 }
 default:
 {
   bytePattern = actualChar;
 }
      }
 
      if ((bytePattern & 0xc0) == 0x80)
      { // 10xxxxxx
 sumb = (sumb << 6) | (bytePattern & 0x3f);
 if (--more == 0) buffer.append((char)sumb);
      }
      else if ((bytePattern & 0x80) == 0x00)
      { // 0xxxxxxx
 buffer.append((char)bytePattern);
      }
      else if ((bytePattern & 0xe0) == 0xc0)
      { // 110xxxxx
 sumb = bytePattern & 0x1f;
 more = 1;
      }
      else if ((bytePattern & 0xf0) == 0xe0)
      { // 1110xxxx
 sumb = bytePattern & 0x0f;
 more = 2;
      }
      else if ((bytePattern & 0xf8) == 0xf0)
      { // 11110xxx
 sumb = bytePattern & 0x07;
 more = 3;
      }
      else if ((bytePattern & 0xfc) == 0xf8)
      { // 111110xx
 sumb = bytePattern & 0x03;
 more = 4;
      }
      else
      { // 1111110x
 sumb = bytePattern & 0x01;
 more = 5;
      }
    }
    return buffer.toString();
  }
}

以上这篇java 中类似js encodeURIComponent 函数的实现案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131238.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号