七牛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标准,将一些特殊字符进行转义,例如空格、感叹号、单引号、左括号、右括号和波浪号等。对于不在允许字符范围内的字符,则使用百分号和十六进制编码表