Java Web中的编码解析

在springmvc工程web.xml中配置中文编码

``` <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name>springUtf8Encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>springUtf8Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ```

如果不配置utf-8的编码的话,提交到后台的请求,以及返回到前台页面的数据都会乱码,因为默认的编码格式是ISO-8859-1

ISO-8859-1编码代码解析

``` private CoderResult encodeArrayLoop(CharBuffer var1, ByteBuffer var2) { // 获得var1的数组对象var3 char[] var3 = var1.array();
    // 获得var1对象的大小
    int var4 = var1.arrayOffset() + var1.position();
    // 获得var1对象的最大容量
    int var5 = var1.arrayOffset() + var1.limit();

    // 校验最大容量大于对象大小
    assert var4 &lt;= var5;

    var4 = var4 &lt;= var5 ? var4 : var5;
    byte[] var6 = var2.array();
    
    // 获得var2对象的大小
    int var7 = var2.arrayOffset() + var2.position();
    // 获得var2对象的最大容量
    int var8 = var2.arrayOffset() + var2.limit();

    assert var7 &lt;= var8;

    var7 = var7 &lt;= var8 ? var7 : var8;

    while(true) {
        CoderResult var10;
        try {
            // 如果待解码的字符串大小大于输出的字节缓存容器,那么返回结果溢出
            if (var4 &gt;= var5) {
                CoderResult var14 = CoderResult.UNDERFLOW;
                return var14;
            }

            // 获取待解码字符
            char var9 = var3[var4];
            
            // 因为一个字节是4位byte,255是8位byte,所以如果字符小于两个byte,那么执行解码
            if (var9 &lt;= 255) {
                if (var7 &gt;= var8) {
                    var10 = CoderResult.OVERFLOW;
                    return var10;
                }
                
                // 将编码结果放入var2的数组对象中
                var6[var7++] = (byte)var9;
                ++var4;
                continue;
            }

            if (this.sgp.parse(var9, var3, var4, var5) &lt; 0) {
                var10 = this.sgp.error();
                return var10;
            }

            // var9超出255范围,返回编码不匹配报错
            var10 = this.sgp.unmappableResult();
        } finally {
            var1.position(var4 - var1.arrayOffset());
            var2.position(var7 - var2.arrayOffset());
        }

        return var10;
    }
}

<p>this.sgp.parse(var9, var3, var4, var5) &lt; 0 判断如果var9参数的数值范围是从 U+DC00 到 U+DFFF,则为 true;否则为 false。如果为true的话,则代表var9这个字符是UTF-16的代理项,那么代表这个字符串应由UTF-16编码,所以应该此处应抛出解析器错误:<br>var10 = this.sgp.error();<br>代理项:除了表示使用 16 位代码点的单个字符,utf-16 编码允许抽象字符来表示使用两个 16 位码位,这被称为代理项对。 在此对的第二个元素是低代理项。 其码位的范围从 u+dc00 到 U + DFFF。 单独的代理项具有其自身; 的任何解释它是有意义的仅当使用作为代理项对的一部分。</p>

                
                                                
原文地址:https://segmentfault.com/a/1190000017067352
原文地址:https://www.cnblogs.com/lalalagq/p/9985803.html