数据经过网络传输都是以字节为单位的,所以所有的数据都必须能够被序列化为字节。在Java中数据要被序列化,必须继承Serializable
接口。
如果把整形数字1234567当做字符来存储,则采用UT-8编码将会占用7个字节,采用UTF-16编码节昂辉占用14个字节,但是把它当做int类型的数字来存储时,则只需4个字节。所以,看一段文本的大小,只看字符本身的长度是没有意义的,即使是一样的字符,采用不同的编码最终存储的大小也会不同,所以从字符到字节一定要看编码类型
另外一个问题,你是否考虑过当我们在计算机中的某个文本编辑器里输入某个汉子时,它到底是怎么表示的。我们知道,在计算机里所有的信息都是以0和1表示的,name一个汉子,它到底是多少个0和1呢。我们能够看到的汉字都是以字符形式出现的,例如在Java中,“淘宝”两个字符在计算机中的十进制数值是28120和23453,16进制是6bd8和5d9d,即这两个字符是由这两个数字唯一表示的。在Java中一个char是16个bit,相当于两个字节,所以,两个汉字用char表示,在内存中会占用相当于4个字节的空间。 把这两个问题搞清楚后,我们看一下在Java web中哪些地方可能会存在编码转换。 用户从浏览器端发起一个Http请求,需要存在编码的地方是 URL,Cookie,Parameter。 服务器端接收到HTTP请求后要解析HTTP,其中URI,Cookie和POST表单参数需要解码,服务器端可能还需要读取数据库中的数据——本地或网络中其他地方的文本文件,这些数据都可能存在编码问题。当Servlet处理完所有请求的数据后,需要将这些数据再编码,通过Socket发送到用户请求的浏览器中,再经过浏览器解码成为文本。这个过程如下图所示;
一次HTTP请求在很多地方需要编解码。 HTTP url请求 的编码 是在浏览器 端。 HTTP url请求的解码是在服务器端 的 java 容器。比如tomcat。
HTTP body部分要现在服务端进行编码,再到浏览器进行解码。 编解码字符集可以通过 response.setCharacterEncoding来设置,它将会覆盖request.getCharacterEncoding的值,并通过Header的Content-type返回客户端,浏览器接收到返回的socket流时将通过content-type的charset来解码。如果返回的没有设置charset,那么将根据html中的charset来解码。或者使用浏览器默认的编码来解码。访问数据库都是通过访问url来制定charset例如,mysql url :
代码语言:javascript复制url="jdbc:mysql://localhost:3306/DB?useUnicode=true&characterEncoding=GBK"
在JS的编码问题
外部引入js文件
代码语言:javascript复制<script src = "/script.js" charset = "gbk"></srcript>
js的URL编码
js中处理URL编码的函数有三个
- 1.escape() 这个函数将ASCII字母,数字,符号之外的其他字符转化为Unicode编码,并且在编码值前加上“%u”
escape("I am 张")
"I am 张"
代码语言:javascript复制unescape("I am 张")
"I am 张"
后来 从ECMAScript V3 标准中删除了,URL的编码可以用encodeURI和encodeURIComponet来代替。
- 2.encodeURI() 与escape相比,encodeURI()时真正js来对url编码的函数,对整个url中非法特殊符号其他字符进行UTF-8编码,在每个码值前加“%”。
encodeURI("http://localhost:8080/jwt_demo/Servlet/myServlet/张三?auther=张三")
"http://localhost:8080/jwt_demo/Servlet/myServlet/张三?auther=张三"
解码通过decodeURI函数
代码语言:javascript复制decodeURI("http://localhost:8080/jwt_demo/Servlet/myServlet/张三?auther=张三")
"http://localhost:8080/jwt_demo/Servlet/myServlet/张三?auther=张三"
- 3.encodeURIComponent() 这个比encodeURI编码还要彻底。除了对 ! ’ ( ) * - . _ ~ 0-9 a-z A-Z 这几个字符不编码,对其他所有字符都编码。这个函数通常用于将以给url当作一个参数放在另一个url中
"http://localhost:8080/ref=" encodeURIComponent("http://localhost:8080/jwt_demo/Servlet/myServlet/张三?auther=张三")
"http://localhost:8080/ref=http://localhost:8080/jwt_demo/Servlet/myServlet/张三?auther=张三"
java与js编解码问题
如果js进行了编码,编码的字符传到服务端后可以用通过java来解码,那么java又是怎么解码的呢? 在java端处理url解码有两个类: java.net.URLEncoder java.net.URLDecoder 这两个类可以将所有“%”加 UTF-8码值用UTF-8解码,从而获得原始的字符。
除了URL和参数编码问题,在服务端还有很多地方需要编码,如xml和jsp还有velocity模板 xml配置文件设置头
代码语言:javascript复制<?xml version = "1.0" endcoding = "UTF-8"?>
velocity模板
代码语言:javascript复制services.velocityService.input.encoding = UTF-8
jsp
代码语言:javascript复制<%@page contentType = "text/html;charst= UTF-8"%>