关于网页中编码的那些事儿

1、请求时URL的编码

浏览器通过URL与服务器进行交互,这里以Firefox和tomcat为例。

先看一下URL分为几部分:http://10.100.33.165:8080/beehive/xx?a=1

首先是 http:// ,所用协议,就不多介绍了;然后是10.100.33.165,这是IP地址,用来定位网络中的物理主机;然后是:8080 ,这是端口号,用来确定主机中的某个进程,8080是tomcat默认的端口号,通过它可以定位到tomcat。


从8080往后的路径都是属于tomcat可配置的东西了,在这之前都是国际标准必须使用英文,不存在转码问题;但是属于tomcat可配置的部分就可以使用非英文字符了,比如中文。

然而URL中包含非英文字符时,Firefox会自动根据某种编码格式将其转换成英文字符,然后再发送出去。我们可以尝试一下,在Firefox地址栏中输入:“ http://localhost:8080/放大 ",然后按一下F12,点击控制台,选中网络,就可以看到最后真正发出去的请求路径其实是长成这个样子的:

GET  http://localhost:8080/%E6%94%BE%E5%A4%A7

标注红色的部分就是”放大“这两个字符被转码以后的样子。现在的问题是,Firefox是根据哪种编码格式进行转换的呢?其实这个是可以自己配置的,具体可以参考这篇文章

好了,在浏览器端设置好URL编码后还不够,因为这个URL是在服务器端被tomcat接收的,那么tomcat是如何解码呢?万一使用的是不同的解码格式,那岂不是乱码了?所以,必须也要配置tomcat解码URL的方式,否则服务器端接收的请求全是乱码。浏览器采用哪种格式编码,tomcat就必须使用相同的格式解码,只有这样才能保证二者沟通的顺畅。

一般来讲,编码都是使用utf-8格式的。tomcat在哪里配置解码URL的方式呢?答案是server.xml,下面截取一部分:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

标红的部分就是我们要修改的。URIEncoding的值要和前端保持一致;或者反过来,前端要和后端保持一致。

(注:以上的情况针对URL路径中包含非引文字符,但是对于查询字符串道理也是一样的,不再赘述。)


2、页面的编码

当后端采用tomcat时,意味着使用jsp技术写网页,我们可以经常在jsp页面中看到这样的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

这里面有至少两个参数的值设为”UTF-8“。

然后在jsp页面的html代码部分还会看到这样的标签:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

这个标签页也有参数设为”UTF-8“。那么有没有疑惑过它们的作用到底是啥?

先说<meta>标签,当服务器接收到一个请求之后,就需要向浏览器返回一点东西。这个东西一般是一个html页面,整个过程大概是这样:

Firefox向tomcat请求一个页面 -> tomcat收到请求 -> tomcat从文件系统中寻找对应的html文件 -> tomcat将文件内容读入到内存发送到网卡 -> 网卡将文件流通过网络发回浏览器。

好了,问题在于,我们写html页面时如果包含了中文字符,那么这个文件的中文字符在内存中是如何显示的呢?显然不会是原汁原味的中文字符,而只是0和1。所以这里又涉及到了字符编码:当一开始把这个html文件保存到硬盘的时候,必然是用某种编码来转换中文的;所以当把这个文件发送到浏览器的时候,浏览器也必须采用相同的编码解读这个文件,才能正常显示相应的内容。

<meta>标签就是在告诉浏览器应该采用哪种编码来解读该html文件。


然后是jsp的page指令。我们知道,如果浏览器请求的是一个静态的html文件,那么tomcat首先应该把这个文件转换成流再发送出去;但如果请求的是一个servlet,那么将由这个servlet动态生成一个html文件流然后发送出去。这里的本质是:服务器返回的是一个html流,而区别在于这个流是由硬盘中的静态文件直接读取出来的还是由servlet动态生成的。

jsp文件本质上也是一个servlet,servlet本质上就是一个java类。而把jsp变成java类的过程中,需要在jsp页面指定编码格式,告诉tomcat的某个组件如何转换其中的中文字符。


完。


参考:http://www.cnblogs.com/haitao-fan/p/3399018.html , http://www.haorooms.com/post/html_meta_ds

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值