zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    使用匿名内部类的创建形式完成线程的2种方式
    线程的2种创建方式
    深入学习 viewport 和 px
    <script> 标签位置应该放在哪里?
    JavaScript 创建对象的几种方式?
    Palindrome Number
    String To Integer
    Reverse Integer
    Zigzag Conversion
    Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9985803.html
Copyright © 2011-2022 走看看