package com.bigaka.common.utils;

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream;

import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang.StringEscapeUtils;

/**

  • @author shijing

  • @version 创建时间:2016年4月23日 上午10:40:15

  • 类说明 */ public class EncodeUtils { private static final String DEFAULT_URL_ENCODING = "UTF-8";

    /**

    • Hex编码. */ public static String hexEncode(byte[] input) { return Hex.encodeHexString(input); }

    /**

    • Hex解码. */ public static byte[] hexDecode(String input) { try { return Hex.decodeHex(input.toCharArray()); } catch (DecoderException e) { throw new IllegalStateException("Hex Decoder exception", e); } }

    /**

    • Base64编码. */ public static String base64Encode(byte[] input) { return new String(Base64.encodeBase64(input)); }

    /**

    • Base64编码, URL安全(将Base64中的URL非法字符如+,/=转为其他字符, 见RFC3548). */ public static String base64UrlSafeEncode(byte[] input) { return Base64.encodeBase64URLSafeString(input); }

    /**

    • Base64解码. */ public static byte[] base64Decode(String input) { return Base64.decodeBase64(input); }

    /**

    • URL 编码, Encode默认为UTF-8. */ public static String urlEncode(String input) { try { return URLEncoder.encode(input, DEFAULT_URL_ENCODING); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("Unsupported Encoding Exception", e); } }

    /**

    • URL 解码, Encode默认为UTF-8. */ public static String urlDecode(String input) { try { return URLDecoder.decode(input, DEFAULT_URL_ENCODING); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("Unsupported Encoding Exception", e); } }

    /**

    • Html 转码. */ public static String htmlEscape(String html) { return StringEscapeUtils.escapeHtml(html); }

    /**

    • Html 解码. */ public static String htmlUnescape(String htmlEscaped) { return StringEscapeUtils.unescapeHtml(htmlEscaped); }

    /**

    • Xml 转码. */ public static String xmlEscape(String xml) { return StringEscapeUtils.escapeXml(xml); }

    /**

    • Xml 解码. / public static String xmlUnescape(String xmlEscaped) { return StringEscapeUtils.unescapeXml(xmlEscaped); } /*
    • 字符串的压缩
    • @param str
    •        待压缩的字符串
      
    • @return 返回压缩后的字符串
    • @throws IOException */ public static String compress(String str) throws IOException { if (null == str || str.length() <= 0) { return str; } // 创建一个新的 byte 数组输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 使用默认缓冲区大小创建新的输出流 GZIPOutputStream gzip = new GZIPOutputStream(out); // 将 b.length 个字节写入此输出流 gzip.write(str.getBytes()); gzip.close(); // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串 return out.toString("ISO-8859-1"); }

    /**

    • 字符串的解压
    • @param str
    •        对字符串解压
      
    • @return 返回解压缩后的字符串 utf-8
    • @throws IOException */ public static String unCompress(String str) throws IOException { if (null == str || str.length() <= 0) { return str; } // 创建一个新的 byte 数组输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); // 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组 ByteArrayInputStream in = new ByteArrayInputStream(str .getBytes("ISO-8859-1")); // 使用默认缓冲区大小创建新的输入流 GZIPInputStream gzip = new GZIPInputStream(in); byte[] buffer = new byte[256]; int n = 0; while ((n = gzip.read(buffer)) >= 0) {// 将未压缩数据读入字节数组 // 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte数组输出流 out.write(buffer, 0, n); } // 使用指定的 charsetName,通过解码字节将缓冲区内容转换为字符串 return out.toString("utf-8"); } }

注意:当进行URLEncode加密过的参数通过浏览器请求时,浏览器会自动URLDecode解密一次 。并且对于"%" 、 "+" 等特殊字符有不同的处理

也就是说,当需要传播的字符,进行加密之后,进过HTTP Post请求或者 浏览器请求,接收方不需要再解密一次(这里的代码工具类decode进行了两次)

另外 jar包以及版本: commons-codec-1.7.jar commons-lang-2.3.jar