在Java Web中设计的编解码
数据经过网络传输都是以字节为单位的,所以所有的数据都必须能够被序列化为字节。在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 :
url="jdbc:mysql://localhost:3306/DB?useUnicode=true&characterEncoding=GBK"
在JS的编码问题
外部引入js文件
<script src = "/script.js" charset = "gbk"></srcript>
js的URL编码
js中处理URL编码的函数有三个
- 1.escape() 这个函数将ASCII字母,数字,符号之外的其他字符转化为Unicode编码,并且在编码值前加上“%u”
escape("I am 张")
"I%20am%20%u5F20"
unescape("I%20am%20%u5F20")
"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/%E5%BC%A0%E4%B8%89?auther=%E5%BC%A0%E4%B8%89"
解码通过decodeURI函数
decodeURI("http://localhost:8080/jwt_demo/Servlet/myServlet/%E5%BC%A0%E4%B8%89?auther=%E5%BC%A0%E4%B8%89")
"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%3A%2F%2Flocalhost%3A8080%2Fjwt_demo%2FServlet%2FmyServlet%2F%E5%BC%A0%E4%B8%89%3Fauther%3D%E5%BC%A0%E4%B8%89"
java与js编解码问题
如果js进行了编码,编码的字符传到服务端后可以用通过java来解码,那么java又是怎么解码的呢? 在java端处理url解码有两个类: java.net.URLEncoder java.net.URLDecoder 这两个类可以将所有“%”加 UTF-8码值用UTF-8解码,从而获得原始的字符。
除了URL和参数编码问题,在服务端还有很多地方需要编码,如xml和jsp还有velocity模板 xml配置文件设置头
<?xml version = "1.0" endcoding = "UTF-8"?>
velocity模板
services.velocityService.input.encoding = UTF-8
jsp
<%@page contentType = "text/html;charst= UTF-8"%>
- 深入浅出解读卷积神经网络
- CNN模型之MobileNet
- 微博MySQL优化之路 - 肖鹏
- 一文看懂常用的梯度下降算法
- Oracle 12.2新特性掌上手册 - 第一卷 Availability
- 深度学习必备---用Keras和直方图均衡化---数据增强
- 基础|认识机器学习中的逻辑回归、决策树、神经网络算法
- CNN模型之ShuffleNet
- 目标检测算法之SSD
- Hadoop学习笔记
- 利用硬链接和truncate降低drop table对线上环境的影响
- 手把手教你实现GAN半监督学习
- 【超全】C语言小白最容易犯的17种错误,你中了几个?
- Oracle 12.2新特性掌上手册 - 第五卷 RAC and Grid
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧
- brk实现
- MapReduce之WritableComparable排序
- MapReduce之Combiner合并
- 05 Spring Boot 整合Spring Security
- 无分类编址 CIDR(构造超网)
- Spring Boot 集成 Mybatis 多数据源配置后出现 Invalid bound statement (not found)
- 解决VM虚拟机页面显示不正常的问题
- 热力图与原始图像融合
- 清华大佬教你用一篇文章完全学会Git,GitHub,Git Server
- 《闲扯Redis九》Redis五种数据类型之Set型
- 【每日一题】28. Implement strStr()
- 小程序组件开发 -- 疫情动态
- 超干货!为了让你彻底弄懂MySQL事务日志,我通宵肝出了这份图解!
- Tomcat 的使用及原理分析(IDEA版)