zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    单例模式(上)单例常见的实现方式
    Netty(六)揭开 BootStrap 的神秘面纱
    Netty(五)Netty 高性能之道
    Netty(四)基于Netty 的简易版RPC
    Netty(三)基于Bio和Netty 的简易版Tomcat
    Netty(二)Netty 与 NIO 之前世今生
    java学习笔记
    Java使用笔记之对象比较
    React学习之受控和非受控组件
    SpringBoot学习之常用注解
  • 原文地址:https://www.cnblogs.com/grape1211/p/8909388.html
Copyright © 2011-2022 走看看