摘要:

URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换。在本文中,我们以使用URLDecoder解决GET请求中文乱码问题为场景说明 URLDecoder/URLEncoder 的用法,并给出了 application/x-www-form-urlencoded MIME 字符串的编码规则。

一. URLDecoder/URLEncoder 使用场景概述

URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换。在介绍 application/x-www-form-urlencoded MIME 字符串之前,我们先考虑如下场景,如下图所示:

我们知道,在我们向客户端发起请求时,浏览器会根据请求URL生成相应的请求报文发送给服务器。在这个过程中,如果我们在浏览器中的地址栏中所输入的URL包含中文字符时,浏览器首先会将这些中文字符进行编码然后再发送给服务器。实际上,浏览器会将它们转换为 application/x-www-form-urlencoded MIME 字符串,如下图所示:

更确切的,当URL地址里包含非西欧字符的字符串时,浏览器都会将这些非西欧字符串转换成application/x-www-form-urlencoded MIME 字符串。在开发过程中,我们可能涉及将普通字符串和这种特殊字符串的相关转换,这就需要使用 URLDecoder 和 URLEncoder类进行实现,其中:

URLDecoder类包含一个decode(String s,String enc)静态方法,它可以将application/x-www-form-urlencoded MIME字符串转成普通字符串;

URLEncoder类包含一个encode(String s,String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencoded MIME字符串。

下面程序示范了普通字符串转与 application/x-www-form-urlencoded MIME 字符串之间的转化。

public class URLDecoderTest {

public static void main(String[] args) throws Exception {

// 将application/x-www-form-urlencoded字符串转换成普通字符串

// 其中的字符串直接从上图所示窗口复制过来,chrome 默认用 UTF-8 字符集进行编码,所以也应该用对应的字符集解码

System.out.println("采用UTF-8字符集进行解码:");

String keyWord = URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "UTF-8");

System.out.println(keyWord);

System.out.println("\n 采用GBK字符集进行解码:");

System.out.println(URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "GBK"));

// 将普通字符串转换成application/x-www-form-urlencoded字符串

System.out.println("\n 采用utf-8字符集:");

String urlStr = URLEncoder.encode("天津大学", "utf-8");

System.out.println(urlStr);

System.out.println("\n 采用GBK字符集:");

String urlStr2 = URLEncoder.encode("天津大学", "GBK");

System.out.println(urlStr2);

}

}/* Output:

采用UTF-8字符集进行解码:

天津大学 Rico

采用GBK字符集进行解码:

澶╂触澶у Rico

采用utf-8字符集:

%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6

采用GBK字符集:

%CC%EC%BD%F2%B4%F3%D1%A7

*///:~

特别地,仅包含西欧字符的普通字符串和application/x-www-form-urlencoded MIME字符串无须转换,而包含中文字符的普通字符串则需要转换,转换的方法是每个中文字符占2个字节,每个字节可以转换成2个十六进制的数字,所以每个中文字符将转换成“%XX%XX”的形式。当然,采用不同的字符集时,每个中文字符对应的字节数并不完全相同,所以使用URLEncoder和URLDecoder进行转换时也需要指定字符集。特别地,字符串应以同样的字符集进行编码和解码,否则会产生意想不到的结果,如上述程序示例所示。

二. 解决GET请求中文乱码问题

URLDecoder的一个应用场景就是解决GET请求的中文乱码问题,如下述代码所示:

Test

String param1 = request.getQueryString();

String param2 = URLDecoder.decode(param1, "utf-8");

out.print(param2.split("=")[1] + "
");

%>

特别需要注意的是,使用此方式对GET请求参数进行解码时,我们必须先对 request.getQueryString 方法的返回值(例如,“name=摩羯西门吹雪”)进行解码,然后再从中取出我们所需要的参数值。如果先取出参数值,然后再对参数值进行解码,则我们将得到乱码,如下图所示:

此外,对于包含中文字符的POST请求参数,我们只需在获取请求参数前通过以下代码语句进行转码即可:

request.setCharacterEncoding("utf-8");

三. URLEncoder & URLDecoder

对 String 编码时,使用以下规则:

字母、数字和字符, “a” 到 “z”、”A” 到 “Z” 和 “0” 到 “9” 保持不变;

特殊字符 “.”、”-“、”*” 和 “_” 保持不变;

空格字符 ” ” 转换为一个加号 “+”。

除此之外,所有的其他字符都是不安全的。因此需要使用一些编码机制将它们转换为一个或多个字节,每个字节用一个包含 3 个字符的字符串 “%xy” 表示,其中 xy 为该字节的两位十六进制表示形式,推荐的编码机制是 UTF-8。例如,使用 UTF-8 编码机制,字符串 “The string ü@foo-bar” 将转换为 “The+string+%C3%BC%40foo-bar”,因为在 UTF-8 中,字符 ü 编码为两个字节,C3 (十六进制)和 BC (十六进制),字符 @ 编码为一个字节 40 (十六进制)。

关于 URLDecoder 类的使用,转换过程正好与 URLEncoder 类使用的过程相反,此不赘述。

关于JSP中文乱码更多的介绍,包括 页面乱码、参数乱码、表单乱码、源文件乱码 等知识,见我的另外两篇博客:《JSP中文乱码问题终极解决方案(上)》 和 《JSP中文乱码问题终极解决方案(下)》。

引用

到此这篇关于java使用URLDecoder和URLEncoder对中文字符进行编码和解码的文章就介绍到这了,更多相关java 文字符编码解码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

java 中文解码_java使用URLDecoder和URLEncoder对中文字符进行编码和解码相关推荐

  1. java tcp 乱码_Java和C++通过Socket通信中文乱码的解决

    理想的开发状态是我开始就是C开发,一直是C的开发,现在还是C的开发,若干年后,幸运的话,我可以成为C语言的高手或者专家-- 更实际的情况是我开始是C开发,后来变成了JAVA开发,然后又做起了VC++的 ...

  2. java解码base64的png图片_使用PHP对图片进行base64编码和解码(png、jpg,声音、视频)...

    为什么要对图片base64编码 base64是网络上最常见的传输8Bit字节代码的编码方式之一.base64主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输.由于一些二进制字符在传输 ...

  3. python中的编码和解码_Python中“is”和“==”之间的区别,以及编码和解码,与

    Python中'is'和'=='的区别,以及编码与解码 Python中'=='和'is'的区别 (1)Python中'==' Python中'==比较变量的值,如果值相同返回True,如果不同返回Fl ...

  4. java读取空格_java 读取文件路径空格和中文的处理

    应用部署时,发生文件读取错误,发现是部署路径中含有空格的文件夹名,然后把应用服务器位置迁移了. 从网上找到如下方案: 1, TestURL().class.getResource("&quo ...

  5. java 配置文件乱码_java程序读取properties配置文件出现中文乱码

    这个问题有两种办法: 第一种办法:如楼上所说的那样也可以,就是native2ascii -reverse -encoding gb2312 user.properties ActionName_zh_ ...

  6. java微信公众号中文乱码_java微信公众平台开发回复中文消息乱码解决方案

    如上图所示,中文乱码,解决方法: 1,找到公众管理平台服务器配置的url请求地址对应的类(java是一个普通的servlet类). 2,在doPost方法中加入以下代码: // 将请求.响应的编码均设 ...

  7. java oval 入门_java开源验证框架OVAL-Go语言中文社区

    @Length,@MaxLength,@MinLength maxLength,minLength只有value属性,表示和value进行比较 min和max是Length的属性 汉字算一个长度 @N ...

  8. java 电子发票_java电子发票管理系统-Go语言中文社区

    目录 引言 这是当时学完SpringBoot后写的一个小项目,当时EasyUI学了一点,而且个人感觉EasyUI用起来是挺好用的,但页面感觉不是很好看,所以这个项目表格用的是EasyUI的,页面用的B ...

  9. java字节流分为_Java文件流可分为字节流和字符流。

    [单选题]TCP 和 UDP 协议的相似之处是 () [单选题]That was the first time I ______ French with a foreigner. [判断题] [判断题 ...

最新文章

  1. AR普及后的未来是怎样的?
  2. 《PRML_Translation》pdf
  3. timestamp mysql php_PHP和Mysql的Timestamp互换
  4. ECharts概念学习系列之ECharts是什么?
  5. 关于linux内核无法编译成模块的解决方法
  6. 实例35:python
  7. 基于MLlib的机器学习--协同过滤与推荐
  8. python生成requirements.txt的两种方法
  9. 关于tensorflow的碎片
  10. Django3 --- async
  11. 互联网日报 | 3月20日 星期六 | 荣耀CEO赵明谈发展目标;家乐福中国未来谋求独立上市;微盟开放接入支付宝小程序能力...
  12. PAT乙级1066 图像过滤
  13. php员工删除,php+mysql删除指定编号员工信息的方法_PHP
  14. 能让程序员瞬间崩溃的五个瞬间,共鸣的同学请举手!
  15. 水性油墨在纺织品印花中的应用
  16. Java 递归、尾递归、非递归 处理阶乘问题
  17. 初识Memcache之安装与测试
  18. 企业级数据模型主题域模型划分(NCR FS-LDM)
  19. redis数据一致性
  20. sfp寄存器_一种基于Linux系统读写光模块寄存器的方法与流程

热门文章

  1. 环形网,核心网,接入网(特例是PON网),承载网
  2. win10安装ensp启动40_升级win10后 eNSP AR启动失败错误代码40的终极思路和解决办法...
  3. 移动web开发,day1,字体标签、平面位移、渐变总结
  4. Springboot自定义注解进行数据唯一性验证
  5. Pytorch 数据增广(Data Augmentation)
  6. Windows Server 2008 R2 系统管理篇(理论+实战)-深博-专题视频课程
  7. Oculus Rift 渲染
  8. 转载, 夏令时导致的时间问题
  9. 【正点原子STM32连载】第三十九章 DS18B20数字温度传感器实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  10. 一阶电路误差分析_精确移相电路的设计举例