栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

网页中文乱码问题
  • 浏览器地址栏中文乱码问题
    • 地址栏上的中文乱码解决
      • 前端解决方法
      • 后端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 。
我所知的修改方式有:

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

以 Tomcat 为例,路径: ??tomcatconfserver.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);

注意:

  1. 该方式,只能解决 post 请求中的中文,对 get 无效。
  2. 必须在 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编码时,转码可以说,你就直接换,也不会出现数据错乱效果的原因。

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530960.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号