使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码

请直接看原文:

 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码_urldecoder.decode-CSDN博客

------------------------------------------------------------------------------------------------------------------------------- 

摘要:

  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.png-14.8kB

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

            

转码.png-48.7kB

  更确切的,当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请求的中文乱码问题,如下述代码所示:

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head><title>Test</title>
</head>
<body><%String param1 = request.getQueryString();String param2 = URLDecoder.decode(param1, "utf-8");out.print(param2.split("=")[1] + "<br>");%>
</body>
</html>

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

            

乱码.png-21.5kB

  此外,对于包含中文字符的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中文乱码问题终极解决方案(下)》。


引用



使用URLDecoder和URLEncoder对中文进行处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

plotnine,一个非常实用的 Python 库!

大家好&#xff0c;今天为大家分享一个非常实用的 Python 库 - plotnine。 Github地址&#xff1a;https://github.com/has2k1/plotnine 在数据分析和可视化领域&#xff0c;Python 提供了许多强大的工具和库。其中&#xff0c;plotnine 是一个基于 Grammar of Graphics 理论的…

短剧在线搜索源码

一个非常哇塞的在线短剧搜索页面&#xff0c;接口已经对接好了&#xff0c;上传源码到服务器解压就能直接用&#xff0c;有能力的可以自己改接口自己写自己的接口 接口文档地址&#xff1a;doc.djcat.sbs 源码免费下载地址抄笔记

独立服务器的优势

独立服务器的优势 高性能 独立服务器提供了卓越的性能&#xff0c;因为它们不与其他用户共享资源。这使得您的网站或应用程序能够快速响应访问请求&#xff0c;并处理大量数据。 安全性 由于没有其他租户在同一服务器上&#xff0c;独立服务器的安全性更高。您可以更好地控制…

Linux运行Window上创建的脚本换行符导致异常

Linux运行Window上创建的脚本换行符导致异常 异常如下&#xff1a; test.sh: line 2: cd: $/usr/local/postgresql/bin/\r: No such file or directory这个错误信息表明&#xff0c;在你的 test.sh 脚本的第二行&#xff0c;你尝试使用 cd 命令来改变当前目录到 ‘/usr/local…

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

rtsp流实现web端实时播放(海康+大华)

最近的电力项目需要嵌入海康摄像头画面&#xff0c;之前没有做过类似的流媒体播放&#xff0c;所以有些懵&#xff1b; 海康开放平台的webAPI&#xff0c;有插件还是无插件&#xff0c;都不适合自研web系统的嵌入&#xff0c;所以需要自己进行解流&#xff1b; 首先&#xff0c…

企业即时通讯工具,企业内部即时通讯系统推荐

企业需要私有化即时通讯系统主要出于以下几个方面的考虑&#xff0c; 数据安全和隐私保护&#xff1a;在企业日常办公中&#xff0c;涉及到大量的敏感信息和机密数据&#xff0c;这些信息如果通过公共即时通讯工具传输&#xff0c;存在被窃取或泄露的风险。通过私有化即时通讯…

如何将Git拉取项目后,将SSH验证方式修改为HTTPS?

首先在打开项目所在位置的Git BashGUI 查找当前的远程仓库URL&#xff1a; 打开终端或命令提示符&#xff0c;导航到你的项目目录&#xff0c;并使用以下命令查看当前配置的远程仓库URL&#xff1a; git remote -v这会显示如下格式的输出&#xff1a; origin gitgithub.com:用…

Linux中GPU相关命令

Linux查看显卡信息&#xff1a; lspci | grep -i vga 使用nvidia GPU可以&#xff1a; lspci | grep -i nvidia1 前边的序号 "00:0f.0"是显卡的代号(这里是用的虚拟机); 查看指定显卡的详细信息用以下指令&#xff1a; lspci -v -s 00:0f.01 Linux查看Nvidia显…

Springboot参数分组校验

Springboot参数分组校验 文章目录 Springboot参数分组校验简介代码准备单个或多个参数的校验非 JSON 格式的对象参数校验JSON 格式的对象参数校验Service 层校验项目地址 简介 Java API规范(JSR303)定义了Bean校验的标准validation-api&#xff0c;但没有提供实现。hibernate …

RedisTemplate实现锁超时时间延长(模仿Redisson看门狗机制)

业务场景&#xff1a; 在上一篇-Java业务功能并发问题处理的最后&#xff0c;我们用RedisTemplate实现了一个分布式锁&#xff0c;但是后面又有用户反馈同个单据出现了重复操作&#xff0c;让我们回忆下上次的加锁代码&#xff1a; 问题描述&#xff1a; 原因出现在我们锁住…

Halcon的了解

Halcon介绍_halcon是什么软件-CSDN博客 德国Mvtec公司开发的一套完善的标准的机器视觉算法包。 Halcon:底层功能算法多&#xff0c;运算性能快&#xff0c;开发需要一定的软件功底和图像处理理论。 它其实是具体的实现功能的算法包。可以跟Qt结合使用。 需求&#xff1a; 二维&…

【开源工程】超经典实景三维数字孪生矿山~智慧矿山解决方案

飞渡科技数字孪生煤矿管理平台&#xff0c;以数字孪生技术为底座&#xff0c;融合图像识别、电磁感应、5G下井等技术&#xff0c;实现矿山环境、采煤装备、移动巡检等生产数据的全面采集&#xff0c;实时感知生产过程与关键装备的运行数据和状态&#xff0c;逐步推进矿山全流程…

电商数据分析22——电商平台交叉销售策略的数据分析

目录 写在开头1. 交叉销售策略的基本原理1.1 交叉销售的精髓1.2 定义与目标1.3 对电商增收的贡献 1.4 深挖数据&#xff0c;揭示机会2.1 用户购买行为分析2.2 商品关联规则挖掘2.3 个性化推荐算法的优化 3. 交叉销售策略的实施案例3.1 案例分析&#xff1a;提升购物车平均价值3…

Redis是如何实现持久化的?请解释RDB和AOF持久化方式的区别和优缺点。Redis是单线程还是多线程的?为什么Redis使用单线程模型仍然能保持高性能?

Redis是如何实现持久化的&#xff1f;请解释RDB和AOF持久化方式的区别和优缺点。 Redis实现持久化主要有两种方式&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。这两种方式的主要区别在于它们的持久化机制和适用场景。…

【趣味学算法】07_爱因斯坦的数学题

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 有一条长阶梯&#xf…

Python爬虫从基础到入门:script标签中的数据

上一篇文章: Python爬虫从基础到入门:script标签中的数据 1. 分析需要抓取的数据的在哪?2. 获取数据、解析数据3. 下载视频、音频文件4. 参考代码1. 分析需要抓取的数据的在哪? 本篇博文以B站视频为例,B站视频在用户没有登录的状态下,只能观看视频尺寸为360流畅,在登录…

深度剖析Kafka中Coordinator的奥秘

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深度剖析Kafka中Coordinator的奥秘 前言什么是Coordinator&#xff1f;Group Coordinator&#xff08;群组协调器&#xff09;&#xff1a;Transaction Coordinator&#xff08;事务协调器&#xff09…

一文让您读懂实时数仓(Apache Doris)

引言&#xff1a; 随着大数据时代的来临&#xff0c;实时数据处理与分析成为企业核心竞争力的关键因素之一。在这场数据革命中&#xff0c;SelectDB成为引领者。从百度自研的实时数仓平台 Palo&#xff0c;到开源项目 Apache Doris&#xff0c;再到飞轮科技研发的 SelectDB&am…

程序人生——Java数组和集合使用建议(1)

目录 引出数组和集合建议60&#xff1a;性能考虑&#xff0c;数组是首选建议61&#xff1a;若有必要&#xff0c;使用变长数组建议62&#xff1a;警惕数组的浅拷贝 建议63&#xff1a;在明确的场景下&#xff0c;为集合指定初始容量建议64&#xff1a;多种最值算法&#xff0c;…