前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Java Web中设计的编解码

在Java Web中设计的编解码

作者头像
MickyInvQ
发布2020-09-27 17:08:26
1.3K0
发布2020-09-27 17:08:26
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏

数据经过网络传输都是以字节为单位的,所以所有的数据都必须能够被序列化为字节。在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”
代码语言:javascript
复制
escape("I am 张")
"I%20am%20%u5F20"
代码语言:javascript
复制
unescape("I%20am%20%u5F20")
"I am 张"

后来 从ECMAScript V3 标准中删除了,URL的编码可以用encodeURI和encodeURIComponet来代替。

  • 2.encodeURI() 与escape相比,encodeURI()时真正js来对url编码的函数,对整个url中非法特殊符号其他字符进行UTF-8编码,在每个码值前加“%”。
代码语言:javascript
复制
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函数

代码语言:javascript
复制
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中
代码语言:javascript
复制
"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配置文件设置头

代码语言: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"%>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在JS的编码问题
    • 外部引入js文件
      • js的URL编码
      • java与js编解码问题
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档