Javaweb 编解码流程
参考:
https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/#N10263
https://www.cnblogs.com/chenssy/p/4207554.html
场景:
JSP: <%@ page language="java" contentType="text/html; charset=uft-8" pageEncoding="utf-8"%>
发起get请求: window.location.href="/testWebb/testWeb?aa="+'我我我哦王'
1.url中参数在内存中以unicode(char)方式保存
2.发起get请求后,浏览器根据页面charset对url参数进行编码(bytes),例如:我我我哦王
gbk:%CE%D2%CE%D2%CE%D2%C5%B6%CD%F5
utf8:%E6%88%91%E6%88%91%E6%88%91%E5%93%A6%E7%8E%8B(%为url规范增加)
3.服务端request
request根据content-type编码格式进行解码(bytes-char),若未设置content-type则默认使用ISO-8859-1进行解码,得到unicode(char);
ISO-8859-1 字符集的编码范围是 0000-00FF,正好和一个字节的编码范围相对应。这种特性保证了使用 ISO-8859-1 进行编码和解码可以保持编码数值“不变”。即
当中文通过gbk/U8转为bytes后再经过ISO转char,再转bytes,再转char内容不变,即ISO无法从bytes中还原出原gbk或utf8编码格式的char。参见参考链接1
4.服务端response
response根据content-type编码格式进行编码(char-bytes),若未设置content-type则默认使用ISO-8859-1进行编码,得到bytes
5.浏览器根据页面charset对bytes进行解码
注释1,char(unicode)对于所有中文都一样,bytes根据编码格式不同而不同
注释2,new String(request.getParameter("aa").getBytes("ISO-8859-1"),"UTF-8")
1.未设置content-type时,request.getParameter()方法按照ISO方式对Bytes(gbk或utf8)进行解码获得unicode(char),此时bytes与char在内存中存储一致;
2.getBytes()方法根据编码格式将char转成bytes(gbk或utf8);
3.new String 编码格式将bytes转成char;编码格式需要与步骤1中原编码格式一致
char(unicode)->gbk/utf8/iso(encode) 页面->%+16(byte)->request decode (gbk/utf8/iso(默认))->char(unicode)->reponse encode->bytes->浏览器 decode(header)->char(unicode)
Javaweb 编解码流程的更多相关文章
- 多媒体文件格式分析 MP3文件结构及编解码流程
多媒体文件格式分析 http://blog.csdn.net/taniya001/article/details/7962864 多媒体文件格式分析 MP3文件结构及编解码流程 http://www. ...
- H264的编解码流程?
- 视频编解码学习之路(H264)
学习视频编解码技术很难吗?视频编解码技术的未来是什么? 明了的说,无论是软件还是硬件设计,视频编解码技术有很多难点,都需要很长一段时间积累才行. 从一开始接触MPEG-2到最新的H.264标准,可算走 ...
- FFmpeg编解码处理1-转码全流程简介
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584901.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...
- iOS8系统H264视频硬件编解码说明
公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会 ...
- android 音频编解码1
1. Android 官方的 MediaCodec API 该 API 是在 Andorid 4.1 (API 16) 版本引入的 MediaCodec 使用的基本流程是: 1234567891011 ...
- FFMPEG解码流程
FFMPEG解码流程: 1. 注册所有容器格式和CODEC: av_register_all() 2. 打开文件: av_open_input_file() 3. 从文件中提取流信息: av_f ...
- 转:关于视频H264编解码的应用实现
转:http://blog.csdn.net/scalerzhangjie/article/details/8273410 项目要用到视频编解码,最近半个月都在搞,说实话真是走了很多弯路,浪费了很多时 ...
- (转)FFMPEG解码流程
http://www.douban.com/note/228831821/ FFMPEG解码流程: 1. 注册所有容器格式和CODEC: av_register_all() 2. 打开 ...
随机推荐
- 安装软件,遇到弹框Windows Installer Coordinator,一直循环卡在这个弹框处
转载自https://www.cliftonsystems.co.uk/fixing-windows-installer-coordinator-loop/ 复制粘贴原文内容,以防将来访问不到原网页了 ...
- Quartz与Spring集成(二)
一.获取quartz详情jar <!-- quartz 的jar --> <dependency> <groupId>org.quartz-scheduler< ...
- NBU显示备份成功,但实际是无备份成功
从3月18日开始到4月3日是备份失败的 GROUPSIZE 7 OPERATION BACKUPDATABASE "DBADB" SQLHOST "yicatong&qu ...
- Appium 学习三:Appium-Desktop 填坑
之前使用appium执行自动化脚本,现使用appium-desktop 遇到了一些问题 1.使用name定位的报错 Locator Strategy 'name' is not supporte ...
- java中mysql查询报错java.sql.SQLException: Before start of result set
异常:java.sql.SQLException: Before start of result set 解决方法:使用rs.getString();前一定要加上rs.next(); sm = con ...
- python note 09 初识函数
1.函数 def my_len(): #自定义函数(相当于len) i = 0 for k in s: i += 1 print(i) print(my_len()) #输出None,因为没有返回值 ...
- 配置java-jdk
我将jdk安装在 /usr/local/jdk目录下 安装好之后 cd /etc/ ls vim profile export JAVA_HOME=/usr/jdk1.8.0_121 #你的jdk所 ...
- java关于get/post请求
package com.study.test; import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu ...
- ubuntu18.04微信小程序学习笔记
安装微信小程序开发工具 安装 https://github.com/cytle/wechat_web_devtools 创建快捷方式 sudo nautilus //在/usr/share/appli ...
- JavaSE基础知识(5)—面向对象(5.6 static关键字)
一.说明 static属于一种修饰符,可以用于修饰 属性.方法.初始化块.内部类用static修饰的成员,称为静态成员不用static修饰的成员,称为普通成员 二.静态属性的特点 1.生命周期 静态属 ...