package cn.keking.hutool; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Serializable; import java.nio.charset.Charset; import java.util.BitSet; /** * URL编码,数据内容的类型是 application/x-www-form-urlencoded。 * *
* 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码; * 2.将空格转换为%20 ; * 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值; * 4.在每个 name=value 对之间放置 & 符号。 ** * @author looly, * */ public class URLEncoder implements Serializable{ private static final long serialVersionUID = 1L; // --------------------------------------------------------------------------------------------- Static method start /** * 默认{@link URLEncoder}
* pchar = unreserved(不处理) / pct-encoded / sub-delims(子分隔符) / ":" / "@"
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
*
*/
public static final URLEncoder DEFAULT = createDefault();
/**
* 用于查询语句的{@link URLEncoder}* 0x20 ' ' =》 '+' * 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is * '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码 * 其它编码为 %nn 形式 ** * 详细见:https://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm */ public static final URLEncoder QUERY = createQuery(); /** * 创建默认{@link URLEncoder}
* pchar = unreserved(不处理) / pct-encoded / sub-delims(子分隔符) / ":" / "@"
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
*
*
* @return {@link URLEncoder}
*/
public static URLEncoder createDefault() {
final URLEncoder encoder = new URLEncoder();
encoder.addSafeCharacter('-');
encoder.addSafeCharacter('.');
encoder.addSafeCharacter('_');
encoder.addSafeCharacter('~');
// Add the sub-delims
encoder.addSafeCharacter('!');
encoder.addSafeCharacter('$');
encoder.addSafeCharacter('&');
encoder.addSafeCharacter('\'');
encoder.addSafeCharacter('(');
encoder.addSafeCharacter(')');
encoder.addSafeCharacter('*');
encoder.addSafeCharacter('+');
encoder.addSafeCharacter(',');
encoder.addSafeCharacter(';');
encoder.addSafeCharacter('=');
// Add the remaining literals
encoder.addSafeCharacter(':');
encoder.addSafeCharacter('@');
// Add '/' so it isn't encoded when we encode a path
encoder.addSafeCharacter('/');
return encoder;
}
/**
* 创建用于查询语句的{@link URLEncoder}* 0x20 ' ' =》 '+' * 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is * '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码 * 其它编码为 %nn 形式 ** * 详细见:https://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm * * @return {@link URLEncoder} */ public static URLEncoder createQuery() { final URLEncoder encoder = new URLEncoder(); // Special encoding for space encoder.setEncodeSpaceAsPlus(true); // Alpha and digit are safe by default // Add the other permitted characters encoder.addSafeCharacter('*'); encoder.addSafeCharacter('-'); encoder.addSafeCharacter('.'); encoder.addSafeCharacter('_'); encoder.addSafeCharacter('='); encoder.addSafeCharacter('&'); return encoder; } // --------------------------------------------------------------------------------------------- Static method end /** 存放安全编码 */ private final BitSet safeCharacters; /** 是否编码空格为+ */ private boolean encodeSpaceAsPlus = false; /** * 构造