七牛URLencode 和 Java 标准库URLEncoder区别
示例
$ qshell urlencode '中文测试 20e760eff257af1be (1) (1).json'
%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95%20%20%20%20%2020e760eff257af1be%20%281%29%20%281%29.json
urlencode的实现代码在七牛官方提供的qshell命令行工具中,该工具的代码托管在GitHub上。您可以前往该仓库的src/qshell目录下查找urlencode.go文件,其中包含了urlencode的具体实现。
func UrlEncode(cfg *iqshell.Config, info UrlInfo) {
if shouldContinue := iqshell.CheckAndLoad(cfg, iqshell.CheckAndLoadInfo{
Checker: &info,
}); !shouldContinue {
return
}
dataEncoded := url.PathEscape(info.Url)
log.Alert(dataEncoded)
}
public class QiniuUrlEncoder {
public static String qEncode(String str) {
try {
return URLEncoder.encode(str, "UTF-8")
.replaceAll("\\+", "%20");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "中文测试 20e760eff257af1be (1) (1).json";
String qshell = QiniuUrlEncoder.qEncode(str);
// go io/net url.PathEscape Java实现:
System.out.println(qshell);
// java标准库中:
System.out.println(URLEncoder.encode(str,"UTF-8"));
}
}
output
%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95%20%20%20%20%2020e760eff257af1be%20%281%29%20%281%29.json
%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95+++++20e760eff257af1be+%281%29+%281%29.json
工具类使用java.net.URLEncoder类对URL进行编码,然后根据RFC 3986标准,将一些特殊字符进行转义,例如空格、感叹号、单引号、左括号、右括号和波浪号等。对于不在允许字符范围内的字符,则使用百分号和十六进制编码表