浏览器地址栏中文乱码问题

您所在的位置:网站首页 龙牙草的功效与作用和图片及功效 浏览器地址栏中文乱码问题

浏览器地址栏中文乱码问题

2023-12-22 12:47| 来源: 网络整理| 查看: 265

网页中文乱码问题 浏览器地址栏中文乱码问题地址栏上的中文乱码解决前端解决方法后端Java的解决方法 参数中的中文乱码解决通过全局配置解决乱码问题配置文件使用 pom 的修改 局部配置解决乱码问题 Java响应体乱码,输出乱码解决 知识储备编码与解码 总结

浏览器地址栏中文乱码问题

在浏览器的地址栏中,有时往往需要使用到中文的一些需求,这个时候改后台就会接收到一堆例如:%E6%9C%89%E8%B6%A3%E7%9A%84%E5%B0%8F%E7%8E%A9%E6%84%8F 这样的中文的URL编码后的结果。

处理上,个人只知道一种全局性的,希望大家要是有什么见解也能分享一下 😃。

地址栏上的中文乱码解决 前端解决方法

decodeURI() 函数 对 encodeURI() 函数编码过的 URI 进行解码。 下面是控制台的试验: 在这里插入图片描述

后端Java的解决方法

Java 中有 java.net.URLEncoder 和 java.net.URLDecoder 类,其功能分别是用来对 HTML 进行编码和解码的工具类。

通过调用:URLEncoder.encode(url) 进行编码,URLDecoder.decode(url) 进行解码。当然也存在双形参的方法,第二个参数用于选择对应的编码格式。

这是一个测试:

public static void main(String[] args) { String url = "https://www.baidu.com/s?wd=哈哈哈,笑死我了"; String frontEncodeUrl = "https://www.baidu.com/s?wd=%E5%93%88%E5%93%88%E5%93%88%EF%BC%8C%E7%AC%91%E6%AD%BB%E6%88%91%E4%BA%86"; String encodeUrl = URLEncoder.encode(url); System.out.println(encodeUrl); System.out.println(URLDecoder.decode(encodeUrl)); System.out.println(URLDecoder.decode(frontEncodeUrl)); }

输出结果:

https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D%E5%93%88%E5%93%88%E5%93%88%EF%BC%8C%E7%AC%91%E6%AD%BB%E6%88%91%E4%BA%86 https://www.baidu.com/s?wd=哈哈哈,笑死我了 https://www.baidu.com/s?wd=哈哈哈,笑死我了

由上不难看出,Java的 URL编码,对符号也进行了编码,而 JavaScript 的编码上会更适用网页地址。

URI包括URL和URN两个类别,URL是URI的子集,二者都是为了表达唯一性的。 URI (Universal Resource Identifier) 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。 URL (Universal Resource Locator) 统一资源定位符,一种定位资源的主要访问机制的字符串,一个标准的URL必须包括:protocol、host、port、path、parameter、anchor。 URN (Universal Resource Name) 统一资源名称,通过特定命名空间中的唯一名称或ID来标识资源。

参数中的中文乱码解决

对于参数中会产生的中文乱码问题,主要是因为浏览器,默认编码都是 ISO-8859-1 。 我所知的修改方式有:

全局配置文件修改获取参数修改编码方式 通过全局配置解决乱码问题 配置文件

以 Tomcat 为例,路径: ??\tomcat\conf\server.xml,其大致在 63 行上下处(个人配置文件显示在 63,可以通过查询进行查找位置,端口也可以在这里修改,以及需要使用的协议)

编码格式根据自己需求修改,一般使用 GBK,GB2312,UTF-8

使用 pom 的修改

同样以 tomcat 为例

org.apache.tomcat.maven tomcat7-maven-plugin 2.2 8080 UTF-8 局部配置解决乱码问题

在Java代码中这样使用

// 获取需要的参数 String active = req.getParameter("active"); // 对获取到的参数结果进行解码与重新编码 String reCodeActive = new String(active.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

这种方式的获取,无论是 post 还是 get 请求都可以进行处理。

也可以 设置请求字符集编码 来解决乱码

//需要先设置编码再取值,否则设置不会生效 req.setCharacterEncoding("utf-8"); // 获取需要的参数 String active = req.getParameter("active"); // 对获取到的参数结果进行解码与重新编码 String reCodeActive = new String(active.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

注意:

该方式,只能解决 post 请求中的中文,对 get 无效。必须在 req.getParameter 之前使用 req.setCharacterEncoding("utf-8"); 否则依旧失效 Java响应体乱码,输出乱码解决

Java 中可以获取到服务器的 response 对象。然而 response 默认响应编码依旧不是我们想要的编码形式。因此,如果想 通过 write 方法在前端展示中文,需要如下设置

resp.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); 知识储备 编码与解码

因为计算机本身是由高低电脉冲所控制的一个电子器械。说白了内部都是 0 和 1 组成的。 为了增强计算机上数据的可读性,由此衍生出了一系列的编码。

就好比方大小写字符这些空格等一些常见的字符,都在 ASCII 中编写的。ASCII 本身就是一种编码,其共有128(27)个字符。标准的 ASCII 码就是这由 7 位 (7bit) 组成的,详情可以去百度百科了解 ASCII

为此,各个国家都希望计算机能够识别自己国家的语言,便自己开发了属于自己国家语言的编码方式,就好比 GBK,GB2312 等。

所以我们在屏幕上,所看到的汉字英文符号等,就是一个个被计算机经过编码后,所展示出来的 隐式 0101 这样的二进制串。

至于如何开发一套编码什么的。。。有大佬知道的话,还请赐教了。

内部都是 0101 ,为什么还要解码? 这个问题其实非常可圈可点,反正都是 0101 的干嘛还要转来转去呢?其根本原因在于 不同的编码本身长度存在差异。

就像之前的 ASCII 码,其只占1字节,但是对于中文都是占两个字节的,这个时候,如果你不去编码,就会导致,误把一个中文读取成了两个ASCII 对应的某个符号什么的也说不定。这也是为啥 有时候使用GBK和GB2312编码时,转码可以说,你就直接换,也不会出现数据错乱效果的原因。

总结

对于乱码问题,只要了解了底层大致,基本遇到问题,都知道原因。 综合而言:只要了解了某一个语言的编码方式,就能知道如何获取你想要的编码格式了。你所要做的就是将之前的编码解开,重新进行想要的编码格式即可。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3