URLEncode和URLDecode的注意事項

執筆記憶的空白發表於2016-04-29

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






相關文章