Java编码url中的中文字符和空格
使用HttpClient发起请求时,有些中文或者有空格的URL需要 encode 方能进行请求,但是使用 java.net.URLEncoder 会把所有特殊字符包括:
和/
都编码 ,所以自己编写了一个转换工具。
// 编码中文和空格部分
public static String urlEncodeChinese(String url){
String resultURL = "";
try {
for (int i = 0; i < url.length(); i++) {
char charAt = url.charAt(i);
//对汉字和空格处理
if (isChinese(charAt) || isNbsp(charAt)) {
String encode = URLEncoder.encode(charAt+"","UTF-8");
resultURL+=encode;
}else {
resultURL+=charAt;
}
}
} catch (Exception e) {
log.error("中文url转码失败",e);
}
return resultURL;
}
// 判断汉字的方法,只要编码在\u4e00到\u9fa5之间的都是汉字
public static boolean isChinese(char c) {
return String.valueOf(c).matches("[\u4e00-\u9fa5]");
}
// 判断空格
public static boolean isNbsp(char c){
return String.valueOf(c).matches("\u00A0|\u0020|\u3000");
}
或者
public static String urlEncodeChinese(String url) {
try {
// 正则匹配中文字符和空格
Matcher matcher = Pattern.compile("[\u4e00-\u9fa5]|\u00A0|\u0020|\u3000").matcher(url);
String tmp = "";
while (matcher.find()) {
tmp = matcher.group();
url = url.replaceAll(tmp, URLEncoder.encode(tmp, "UTF-8"));
}
} catch (Exception e) {
log.error("中文url转码失败",e);
}
return url;
}
补充:
这里空格被替换成+
,当然也有转成%20
的,这个是因为标准不一样,如果需要保证能被遵循RFC 2396标准的应用使用,应当替换为%20
replaceAll("\+", "%20")
1.不间断空格
\u00A0
,主要用在office中,让一个单词在结尾处不会换行显示,快捷键ctrl+shift+space ;
2.半角空格(英文符号)\u0020
,代码中常用的;
3.全角空格(中文符号)\u3000
,中文文章中使用;