Encode(编码)和Decode(解码)是在信息处理中常用的概念,用于表示将信息从一种形式转换为另一种形式的过程。
v直接demo
- import java.io.UnsupportedEncodingException;
- import java.net.URLDecoder;
- import java.net.URLEncoder;
- import java.util.ArrayList;
- import java.util.List;
- public class UrlParamEncoder {
- public static void main(String[] args) throws UnsupportedEncodingException {
- String url = "https://www.test.com/s?wd=%E7%99%BE%E5%BA%A6&rsv_spt=1&rsv_iqid=0xbe352d6c00064d34&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=17&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=%25E7%2599%25BE%25E5%25BA%25A6&rsp=6&inputT=3412&rsv_sug4=5053";
- String encodedUrl = encodeSpecificParam(url, "prefixsug", true);
- System.out.println(url);
- System.out.println(encodedUrl);
- }
- /**
- * 对指定参数进行编码
- * ignore是否先解码再编码
- * @param url
- * @param targetParam
- * @param ignore
- * @return
- */
- public static String encodeSpecificParam(String url, String targetParam, boolean ignore) {
- try {
- // 分割基础URL和查询部分
- String[] urlParts = url.split("\\?", 2);
- String baseUrl = urlParts[0];
- String queryAndFragment = urlParts.length > 1 ? urlParts[1] : "";
- // 分离查询参数和锚点
- String[] queryFragment = queryAndFragment.split("#", 2);
- String query = queryFragment[0];
- String fragment = queryFragment.length > 1 ? "#" + queryFragment[1] : "";
- // 解析查询参数
- List<Param> params = parseQueryString(query);
- // 编码目标参数
- for (Param param : params) {
- if (param.key.equals(targetParam)) {
- String decoded = ignore ? param.value : URLDecoder.decode(param.value, "UTF-8");
- String encoded = URLEncoder.encode(decoded, "UTF-8")
- .replace("+", "%20"); // 将+转换为%20
- param.value = encoded;
- }
- }
- // 重构查询字符串
- StringBuilder newQuery = new StringBuilder();
- for (Param param : params) {
- if (newQuery.length() > 0) {
- newQuery.append("&");
- }
- newQuery.append(param.key).append("=").append(param.value);
- }
- // 组合最终URL
- return baseUrl
- + (newQuery.length() > 0 ? "?" : "")
- + newQuery.toString()
- + fragment;
- } catch (UnsupportedEncodingException e) {
- throw new RuntimeException("字符编码错误", e);
- }
- }
- private static List<Param> parseQueryString(String query) {
- List<Param> params = new ArrayList<>();
- if (query == null || query.isEmpty()) return params;
- for (String pair : query.split("&")) {
- int idx = pair.indexOf("=");
- String key = (idx > 0) ? pair.substring(0, idx) : pair;
- String value = (idx > 0 && pair.length() > idx + 1) ? pair.substring(idx + 1) : "";
- params.add(new Param(key, value));
- }
- return params;
- }
- static class Param {
- String key;
- String value;
- Param(String key, String value) {
- this.key = key;
- this.value = value;
- }
- }
- }
复制代码 v源码地址
https://github.com/toutouge/javademosecond/tree/master/hellolearn
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |