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

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

在浏览器的地址栏中,有时往往需要使用到中文的一些需求,这个时候改后台就会接收到一堆例如:%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.URLEncoderjava.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 为例,路径: ??\tomcat\conf\server.xml,其大致在 63 行上下处(个人配置文件显示在 63,可以通过查询进行查找位置,端口也可以在这里修改,以及需要使用的协议)

<!-- 增加 URIEncoding="utf-8" useBodyEncodingForURI="true" -->
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8" useBodyEncodingForURI="true"/>

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

使用 pom 的修改

同样以 tomcat 为例

<build>
    <plugins>
        <!-- tomcat 插件 -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>8080</port>
                <!-- 更改uri编码 -->
                <uriEncoding>UTF-8</uriEncoding>
            </configuration>
        </plugin>
    </plugins>
</build>

局部配置解决乱码问题

在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");

知识储备

编码与解码

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

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

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

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

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

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

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值