十六进制值 | |||
1. | + | URL 中+号表示空格 | %2B |
2. | 空格 | URL中的空格可以用+号或者编码 | %20 |
3. | / | 分隔目录和子目录 | %2F |
4. | ? | 分隔实际的 URL 和参数 | %3F |
5. | % | 指定特殊字符 | %25 |
6. | # | 表示书签 | %23 |
7. | & | URL 中指定的参数间的分隔符 | %26 |
8. | = | URL 中指定参数的值 | %3D |
js中替换字符变量如下:
data2=data2.replace(/\%/g,"%25");
data2=data2.replace(/\#/g,"%23");
data2=data2.replace(/\&/g,"%26");
1,代码中可以使用
URLEncoder.encode(url, "UTF-8");
2.判断是否含有特殊字符
/** * 判断是否含有特殊字符 * * @param str * @return true为包含,false为不包含 */ public static boolean isSpecialChar(String str) { String regEx = "[ _`~!@#$%^&*()+=|{}‘:;‘,\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\n|\r|\t"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.find(); }
public static final String DEFAULT_QUERY_REGEX = "[!$^&*+=|{}‘;‘\",<>/?~!#¥%……&*——|{}【】‘;:”“‘。,、?]"; /** * 判断查询参数中是否以特殊字符开头,如果以特殊字符开头则返回true,否则返回false * * @param value * @return * @see {@link #getQueryRegex()} * @see {@link #DEFAULT_QUERY_REGEX} */ public boolean specialSymbols(String value) { if (StringUtil.isBlank(value)) { return false; } Pattern pattern = Pattern.compile(getQueryRegex()); Matcher matcher = pattern.matcher(value); char[] specialSymbols = getQueryRegex().toCharArray(); boolean isStartWithSpecialSymbol = false; // 是否以特殊字符开头 for (int i = 0; i < specialSymbols.length; i++) { char c = specialSymbols[i]; if (value.indexOf(c) == 0) { isStartWithSpecialSymbol = true; break; } } return matcher.find() && isStartWithSpecialSymbol; } /** * 获取查询过滤的非法字符 * * @return */ protected String getQueryRegex() { return DEFAULT_QUERY_REGEX; }
经常和公司算法组同事相处,有一天看他们代码,去除字符串中的空格换行符。我的思路就是①正则匹配替换 或者②遍历该字符串挑出合法字符存到另外一片内存里。同事仅仅用同一个数组完成去非法字符,尽管Java不太注重这些,但是高效应该是每个程序员毕生追求。另外吐槽下正则表达式,这种反人类的设计简直。。。好吧,如何绕过正则实现字符串内去空格,请移步《Java字符串去除空格换行符》