URLEncoder使用踩坑
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、多看源码
URLEncoder使用踩坑的更多相关文章
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~
这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- 我的微信小程序入门踩坑之旅
前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...
- router路由去掉#!的踩坑记
项目中在研究去掉router#!的过程中的踩坑过程.
- vue+ vue-router + webpack 踩坑之旅
说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案 老司机可以忽略下面的内容了 1)起因 考虑到数据分离的问题 因为server是express搭的 自然少 ...
- 记jQuery.fn.show的一次踩坑和问题排查
最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...
- WebForm路由踩坑 ajax请求多次
WebForm路由踩坑 再次接触Asp.Net WebForm已是4年后的今天,源起新入职的公司,一个老的项目. Web接触的少,那就多动手写写. WebForm1.aspx <body> ...
随机推荐
- XCTF-crypto---转轮机加密
转轮密码机是由一个输入键盘和一组转轮组成的,每个转轮上标有26个字母,字母的顺序随意,转轮之间由齿轮进行连接,当一个转轮转动时,可以讲一个字母转化为另一个字母. 工作原理: 转轮机由多个转轮构成,每个 ...
- http 怎样关闭
如何优雅的关闭关闭这个fd , 如果只是一个简单的fd 直接调用close 就行, 但是如果要是一个框架 那就接到 资源回收复用 内存泄漏等问题: 来看看 ngx 是用怎样的思路处理 事务结束动作: ...
- TIME_WAIT状态存在的原因
TIME_WAIT状态存在有两个理由: 1.可靠地实现TCP全双工连接的中断 2.允许老的重复分节在网络中消失 第一个理由:如果客户端的ACK丢失了,服务器将会重新发送它的最终的那个FIN,因此客户端 ...
- prometheus函数介绍
一 函数介绍 gauge类型的数据 属于随机变化数值,并不像counter那样 是 持续增长 1 increase() increase 函数 在promethes中,是⽤来 针对Counter 这 ...
- Vue2.x 响应式部分源码阅读记录
之前也用了一段时间Vue,对其用法也较为熟练了,但是对各种用法和各种api使用都是只知其然而不知其所以然.最近利用空闲时间尝试的去看看Vue的源码,以便更了解其具体原理实现,跟着学习学习. Proxy ...
- TCP/IP模型简介和/etc/hosts文件说明
软件=协议的实现. IP决定了主机的位置.端口号决定了进程的位置. 两台主机上的通讯实际是两台主机上两个具体进程的通讯. TCP/IP模型分四层: TCP/IP模型:应用层---传输层----网络层- ...
- conda / cuda / screen 常用命令总结
记录一些常用的 conda / cuda / screen 相关的命令,这些在跑深度学习代码时经常用到. conda 下面的命令在 Ubuntu 下的 4.8.3 版本 conda 均正确工作. 查看 ...
- 【震惊】手把手教你用python做绘图工具(一)
在这篇博客里将为你介绍如何通过numpy和cv2进行结和去创建画布,包括空白画布.白色画布和彩色画布.创建画布是制作绘图工具的前提,有了画布我们就可以在画布上尽情的挥洒自己的艺术细胞. 还在为如何去绘 ...
- Java 虚拟机运行时数据区详解
本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...
- Intel s2600系列做虚拟化需要注意的item
Intel s2600cw\cp主板做虚拟化BIOS需要设置以下选项,附件为截图供参考. -->vt,cpu虚拟化,默认关闭,需要确保开启 -->ht,cpu超线程,默认开启,需要确保开启 ...