URL编码

URL 编码是浏览器发送数据给服务器时使用的编码,它通常附加在 URL 的参数部分。

为什么需要 URL 编码

举个例子,我们在百度里搜索“中文”这两个字,其发送给后台服务器的网址类似这样的:https://www.baidu.com/s?wd=%E4%B8%AD%E6%96%87

我们可以打开浏览器控制台查看:

这些字符串是怎么来的呢?是通过 URL 编码的方式得出的。以前很多服务器只识别 ASCII 字符。但如果 URL 中包含中文、日文这些非 ASCII 字符怎么办?就得 URL 编码规则来转换了:

  • 如果字符是 A ~ Z​,a ~z​,0 ~ 9​ 以及 -​、_​、.​、*​,则保持不变
  • 如果是其他字符,先转换为 UTF-8 编码,然后对每个字节以 %XX​表示
  • URL 编码总是大写

例如:字符 ​​的 UTF-8 编码是 0xe4b8ad​​,因此,它的 URL 编码是 %E4%B8%AD​​。

URLEncoder

很多语言都提供了对 URL 进行编码的工具类。例如在 Java 中,提供了 URLEncoder 来对字符进行编码,我们来试试对“中文!” 这个词进行编码:

import java.net.URLEncoder;

public class TestURL{
    public static void main(String[] args) throws Exception{
        String encoded = URLEncoder.encode("中文!", "UTF-8");
        System.out.println(encoded);
    }
}

上述代码的运行结果是 %E4%B8%AD%E6%96%87%21​, ​的 URL 编码是 %E4%B8%AD​, ​的 URL 编码是 %E6%96%87​,! ​虽然是 ASCII 字符(这里用更多是半角符号),也要对其编码为 %21​。

和标准的 URL 编码稍有不同,URLEncoder 把空格字符编码成 +​,而现在的 URL 编码标准要求空格被编码为 %20​,不过,服务器都可以处理这两种情况。

URLDecoder

如果服务器收到 URL 编码的字符串,就可以对其进行解码,还原成原始字符串。Java 标准库的 URLDecoder ​就可以解码:

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
public class TestURL {
    public static void main(String[] args) {
        String decoded = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", StandardCharsets.UTF_8);
        System.out.println(decoded);
    }
}

完整代码

import java.net.URLDecoder;
import java.net.URLEncoder;

public class TestURL {
  public static void main(String[] args) throws Exception{
    String encoded = URLEncoder.encode("中文!", "UTF-8");
    System.out.println(encoded);  //%E4%B8%AD%E6%96%87%21


    String decoString = URLDecoder.decode("%E4%B8%AD%E6%96%87%21", "UTF-8");
    System.out.println(decoString);    //中文
  }
}

小结

URL 编码的目的是把任意文本数据编码为 %​ 前缀表示的文本,编码后的文本仅包含 A ~ Z​,a ~ z​,0 ~ 9​,-​,_​,.​,*​ 和 %​,便于浏览器和服务器处理。

posted @ 2024-06-21 10:47  peterjxl  阅读(9)  评论(0编辑  收藏  举报