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、多看源码

最新文章

  1. AFNetWorking3.0源码分析
  2. Apache Rewrite匹配问号的问题
  3. 封装一个mysql类(ggshop)
  4. eclipse的maven项目报Missing artifact jdk.toos:jdk.toos:jar:1.6错
  5. 初识GO语言——安装Go语言
  6. GUN485项目的总结
  7. Asp.net MVC中Route的理解
  8. sql 清空所有数据
  9. 《javascript高级程序设计》 第23章 离线应用与客户端存储
  10. codeforces #240 div 2
  11. HDU5100Chessboard(数论)
  12. BZOJ 1038 瞭望塔
  13. Sysbench - 一种系统性能benchmark
  14. Html分组标签
  15. 简单聊聊不可或缺的Nginx反向代理服务器--实现负载均衡【上篇】
  16. 【java】抓取页面内容,提取链接(此方法可以http get无需账号密码的请求)
  17. Map集合学习总结
  18. git知识总结-1.git基础之git reference
  19. Ionic2生成的main.js执行时间10s+
  20. P1962 斐波那契数列

热门文章

  1. 内核搞笑的bug不少
  2. linux 内核 同步原理
  3. 幻读在 InnoDB 中是被如何解决的?(转)
  4. 13Linux之磁盘管理
  5. arm-linux openssl移植
  6. [LeetCode题解]21. 合并两个有序链表 | 递归
  7. Cassandra存储附带索引(SAI)全新上线
  8. 原生javascript包装一个ajax方法
  9. 使用javaxmail发送文字邮件
  10. django基本内容