# 背景:

看着别人项目代码看到一个PathUtils工具类,

里面只有一个方法,String  rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中因为中文乱码导致程序异常

上面的方法的用处是,获取到项目配置文件的路径,通过 rebuild 方法返回解码后的路径。

# 疑惑:

由于我不清楚Path变量是怎么样的情况,为什么要经过rebuild方法过滤一遍

就想测试下,如果是正常中文进行解码,解码后的字符串还是一样的吗?

String newPath = "Keywords=湿答答";
try {
newPath = URLDecoder.decode(newPath, "UTF-8");
System.out.println(newPath);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

结果中文没有发生变化。

接着我查看的 URLDecoder的decode方法,  + 号和 % 开头的字符串才会进行解码

note:这里的编码解码也称   %百分号编码解码

# 深入学习:

接着,用百度搜索的下 “urldecoder 编码和解码”

发现url编码解码主要是应用于发送 http 的 get 请求时,对特定字符串进行编码,后台服务器会对get请求的url进行解码,以保证网络传输过程中数据的正常。

看到一篇文章 不同浏览器中URL的编码方式

不同浏览器对编码字符的编码方式是不同的,

如IE浏览器可以设置编码的方式

可以设置是否发送utf-8格式的url

浏览器对URL编码方式不一样可能会导致我们后台获取到的数据是错误的。

浏览器编码方式有gbk,utf-8,等等,

假设:浏览器使用gbk的编码方式编码中文参数。我们后台服务器接收到后会进行utf-8解码,因为解码方式不一样,就导致我们获取到的参数是乱码的

为了避免这个问题我们需要自己对get请求的参数进行url编码。

为什么要自己主动对参数进行编码呢,需要先大概看下编码解码过程

注意:url编码解码也称   %百分号编码解码

编码过程:

字母,特殊用户字符(/,:@-_.等。即斜杠,逗号,点,冒号,横线,下划线等)

会被直接跳过,不会进行编码处理,

其他的所有字符都要经过%xx编码处理。

encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

编码方法很简单,在该字节ascii码的的16进制字符前面加%

如 空格字符,ascii码是32,对应16进制是'20',那么urlencode编码结果是 %20

由于JavaScript使用的是Unicode编码,也就是utf-8编码,所以编码函数也是使用utf-8编码,

所以js的encodeURI函数,编码中文,‘爱’  是三个字节,编码后 %e7%88%b1  ,这3个十六进制就代表,爱

解码过程:

解码是编码的逆向,对匹配到的百分号编码进行反向解码,字母和特殊字符也会被跳过。java中会对+号字符进行特殊处理,直接用空格替换。

上面的编码和解码有一个值得注意的地方,浏览器不会对 + 号进行编码,而tomcat或jetty服务器会将这个加号使用空格替换。

如下面的get请求

http://localhost:8080/api/test?aa=zhang+san&p2=18

我们java中使用request.getParameter("aa")方法获取到的aa参数的值是zhang san

+ 号被替换成的空格

这是一种情况,用户输入,跟我们获取到的数据不一致

还有一种情况,服务器是以 & 符号进行分割参数的,如果我们把上面+号替换成&

http://localhost:8080/api/test?aa=zhang&san&p2=18

我们获取到aa的值是zhang

服务器会认为这个get请求有三个参数,以 & 为分隔符

分别是

aa=zhang

san=

p2=18

为了避免以上问题,我们都不应该让浏览器对参数进行编码,而是我们自己做编码

java学习-http中get请求的非ascii参数如何编码解码探讨的更多相关文章

  1. java学习-get和post请求

    摘要 看完本文可以知道,使用java原生编写get/post请求的步骤,进行网络请求时应该注意的地方. 这里使用java自带的HttpUrlConnection对象进行网络请求, 请求步骤大致分为五步 ...

  2. ajax请求参数中含有特殊字符"#"的问题 (另附上js编码解码的几种方法)

    使用ajax向后台提交的时候 由于参数中含有#  默认会被截断 只保留#之前的字符  json格式的字符串则不会被请求到后台的action 可以使用encodeURIComponent在前台进行编码, ...

  3. 简单测试Java线程安全中阻塞同步与非阻塞同步性能

    摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>13.2.2 线程安全的实现方法 1.名词解释 同步是指锁哥线程并发访问共享数据时,保证共享数据同一时刻只被一个线程访 ...

  4. java学习(更新中)

    class Test { public static void main(String[] args) { System.out.println("Hello World!"); ...

  5. Java学习笔记之——this关键字、非静态成员属性和静态成员属性的区别、类的加载顺序

    一.this关键字 1.代表当前类的对象 2.通过” . ”调用成员属性和成员方法 3.通过this可以区分成员属性和参数 参数名和属性名相同的情况,默认是参数名 二.非静态成员属性和静态成员属性的区 ...

  6. java 获取request中的请求参数

    1.get 和 post请求方式 (1)request.getParameterNames(); 获取所有参数key后.遍历request.getParameter(key)获取value (2)re ...

  7. Java学习——方法中传递参数分简单类型与复杂类型(引用类型)编程计算100+98+96+。。。+4+2+1的值,用递归方法实现

    package hello; public class digui { public static void main(String[] args) { // TODO Auto-generated ...

  8. 如何用java发送Http的post请求,并传递参数

    书写方法,请参考以下代码: package utils; import java.io.BufferedReader; import java.io.IOException; import java. ...

  9. 【Java学习笔记之二十八】深入了解Java8新特性

    前言: Java8 已经发布很久了,很多报道表明java8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 ...

随机推荐

  1. 2.1.4synchronized方法与锁对象

    为了证明线程锁的是对象 测试 package com.cky.bean; /** * Created by chenkaiyang on 2017/12/4. */ public class MyOb ...

  2. C#-VS支持的语言

    其中C语言选C++

  3. 合理提升WEB前端性能

    前端的优化包括四个部分:HTML结构优化.CSS样式优化.JS行为优化.服务器的优化.合理的前端优化不仅能够提升网站加载速度,而且能够更好的提升用户体验和团队开发效率.所以前端性能优化的重要性是不言而 ...

  4. 模式PK:命令模式VS策略模式

    1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为“算法”已经是一个 ...

  5. bzoj网络流

    近期看了一些bzoj的网络流,深感智商不够.不过对于网络流又有了进一步的理解. 还是mark一下吧. 献上几篇论文:1)<最小割模型在信息学竞赛中的应用> 2)<浅析一类最小割问题& ...

  6. 关于TF卡的工作原理

    首先关于TF卡的定义 其次是TF卡的卡槽 有4个数据传输端,D0,D1,D2,D3.有一个CMD脚,是用来读取卡内信息的,在刚插入TF时,主机会读取卡的内存大小,格式之类的. Sd脚是插入检测脚,当卡 ...

  7. ExternalException (0x80004005): GDI+ 中发生一般性错误

    .net开发的程序用了一个自绘的框架, 平常部署到IIS上都没有问题,今天突然之间这个功能就运行不起来了. 报错:GDI+错误,然后在本地的VS里面运行是没有问题的 百度出来的改Path环境变量.注册 ...

  8. windows 7 下elasticsearch5.0 安装head 插件

    windows 7 下elasticsearch5.0 安装head 插件 elasticsearch5.0 和2有了很大的变化,以前的很多插件都有了变化比如 bigdesk head,以下是安装he ...

  9. UWP Button添加圆角阴影(一)

    原文:UWP Button添加圆角阴影(一) 众所周知,17763之前的UWP控件,大部分是没有圆角属性的:而阴影也只有17763中的ThemeShadow可以直接在xaml中使用,之前的版本只能用D ...

  10. C# 使用Google Protocol Buffers

    Google Protocol Buffers 使用3.0版本 下载protoc.exe 下载链接 https://github.com/protocolbuffers/protobuf/releas ...