URLEncoder使用踩坑

行走在程式碼邊緣發表於2020-12-09

URLEncoder使用

背景介紹

今天需要傳一些描述資訊給前端,需要寫在header裡面,所以要先編碼成utf-8的格式,再有前端解碼獲取。

工作過程

前提:我要傳給前端的文字是我從中臺那邊拿到的。

public class URLEncoderTest {

    @Test
    public void test_01() throws UnsupportedEncodingException {
        String str = "這是前臺給我的資料 ";
        final String encode = URLEncoder.encode(str, "utf-8");
        System.out.println(encode); // 
    }
}
// 列印出來的結果:
//%E8%BF%99%E6%98%AF%E5%89%8D%E5%8F%B0%E7%BB%99%E6%88%91%E7%9A%84%E6%95%B0%E6%8D%AE+

末尾莫名其妙出來了一個“+”。我想了很久都沒想明白,我以為是java編碼的原因,還暗自嘲諷了一下,然後我採用了一個非常low的方式解決了這個問題。

手動給解碼後的字串刪除'+'號,經過實驗,前端可以完美的解碼。

System.out.println(StringUtils.remove(encode, '+'));
//%E8%BF%99%E6%98%AF%E5%89%8D%E5%8F%B0%E7%BB%99%E6%88%91%E7%9A%84%E6%95%B0%E6%8D%AE

review的時候,同事提出了意見,問我這裡為什麼要加上這一行,我解釋完之後,同時表示幫我排查下原因,然後他不到五分鐘就發現了。

我獲取到的字串裡有空格。

我去中臺看了我填入的描述資訊,果然是有空格的。

public class URLEncoderTest {

    @Test
    public void test_01() throws UnsupportedEncodingException {
        String str = "這是前臺給我的資料";
        final String encode = URLEncoder.encode(str, "utf-8");
        System.out.println(encode); 
    }
    // 列印結果
  //%E8%BF%99%E6%98%AF%E5%89%8D%E5%8F%B0%E7%BB%99%E6%88%91%E7%9A%84%E6%95%B0%E6%8D%AE
}

URLEncoder#encode分析

貼上一部分程式碼

for (int i = 0; i < s.length();) {
    int c = (int) s.charAt(i);
    if (dontNeedEncoding.get(c)) {
        // 當 c 是 ‘’ 時,將 c 賦值為 ‘+’,然後加到out上
        if (c == ' ') {
            c = '+';
            needToChange = true;
        }
        out.append((char)c);
        i++;
    }
}

所以會出現"+"

總結

1、要細心,程式設計師這一行一定要細心!

2、多問人(前提是你要有願意幫你的人)

3、多看原始碼