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
上一篇:bzoj 3325 密码 - Manacher


下一篇:2018-02-04 AppleScript类自然语言与非英语语法设计