有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。下表中列出了一些URL特殊符号及编码
| 十六进制值 | |||
| 1. | + | URL 中+号表示空格 | %2B |
| 2. | 空格 | URL中的空格可以用+号或者编码 | %20 |
| 3. | / | 分隔目录和子目录 | %2F |
| 4. | ? | 分隔实际的 URL 和参数 | %3F |
| 5. | % | 指定特殊字符 | %25 |
| 6. | # | 表示书签 | %23 |
| 7. | & | URL 中指定的参数间的分隔符 | %26 |
| 8. | = | URL 中指定参数的值 | %3D |
解决的方法:
replace() 方法如果直接用str.replace(“-“,”!”)只会替换第一个匹配的字符.
而str.replace(/\-/g,”!”)则可以替换掉全部匹配的字符(g为全局标志)。
replace()
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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
经常和公司算法组同事相处,有一天看他们代码,去除字符串中的空格换行符。我的思路就是①正则匹配替换 或者②遍历该字符串挑出合法字符存到另外一片内存里。同事仅仅用同一个数组完成去非法字符,尽管Java不太注重这些,但是高效应该是每个程序员毕生追求。另外吐槽下正则表达式,这种反人类的设计简直。。。好吧,如何绕过正则实现字符串内去空格,请移步《Java字符串去除空格换行符》