• 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
  • 相关阅读:
    打印九九乘法表
    PAT (Basic Level) Practice (中文) 1091 N-自守数 (15分)
    PAT (Basic Level) Practice (中文)1090 危险品装箱 (25分) (单身狗进阶版 使用map+ vector+数组标记)
    PAT (Basic Level) Practice (中文) 1088 三人行 (20分)
    PAT (Basic Level) Practice (中文) 1087 有多少不同的值 (20分)
    PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)
    PAT (Basic Level) Practice (中文) 1085 PAT单位排行 (25分) (map搜索+set排序+并列进行排行)
    PAT (Basic Level) Practice (中文) 1083 是否存在相等的差 (20分)
    PAT (Basic Level) Practice (中文) 1082 射击比赛 (20分)
    PAT (Basic Level) Practice (中文) 1081 检查密码 (15分)
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9985803.html
Copyright © 2020-2023  润新知