现在我们来分析几个例子:
1) jsp中如果使用了:
<%@ page contentType="text/html; charset=Shift_JIS" %>
他 其实就是 指定了 response 的 类型和字符的编码方式,上面指定了 response 的 字符编码是 是 Shift_JIS 。
注意的是如果沒有指定 requset 的 编码 , 那么从 request 得到的 String 都是 iso-8859-1 编码的 。 ( 上一篇 已经讲过了 。 ) ,他和 charset 是没有关系的。
如果 要输出的 String 的 编码 和 response 的 编码不一样的话 ,就很可能出 现乱码 的情況。
举个例子 :
<%@ page contentType="text/html; charset= GB2312 " %> /// 指定 response 的 编码为中文简体 ,那 么 所有的 要输出的字符都要使用和 GB2312 相适应的编码
<html>
<head><title></title>
</head>
<body>
<%
String name=request.getParameter("name"); 得到 客户端 的參數 值 ,沒有指定 request 的 编码 ,所以它是 编码为 iso-8859-1 的 String 的。
String name1=new String(name.getBytes("ISO-8859-1")," GB2312 ") ;// 转化为中文简体的编码
String name2=" 你好 "; / 直接定義 String, 使用 reponse 的 编码 , 这里是 GB2312 的。
String name21=new String(name2.getBytes("ISO-8859-1")," GB2312 "); 从 name2 转化
System.out.println("name1 is GB2312 "+name1);
System.out.println("name is ISO-8859-1"+name);
System.out.println("name21 is 直接 "+name21);
System.out.println(" 我们大家 ");
%>
<form action="./B.jsp" method="POST">
<input type="text" name="name" value="<%=name1%>">
<input type="submit">
</form>
<hr>
name1 is GB2312 <%=name1%><br>
name is ISO-8859-1 <%=name%><br>
name2 1 is 直接 <%=name21%><br>
<%=" 我们大家 "%></body>
</html>
結果:
console 中: ( 他 对应 response 的 编码是 GB2312 的,日文系統 是 MS932 )
name1 is GB2312 你好 //name1 是 name 转化来 的,是 GB2312 的,所以正常顯示
name is ISO-8859-1???? /name 是 ISO-8859-1 的不能正常顯示的
name21 is 直接 ??????????????????? 由於 name2 是 GB2312 編碼的 , 在 name21 =new String(name2.getBytes(" ISO-8859-1 "),"GB2312")) 發生了錯誤的轉化,所以不能正常的現實,如果將 ISO-8859-1 換為 GB2312 就可以了。
我们大家 //jsp 中定義的 string 是採用 <%@ page contentType="text/html; charset= GB2312 " %> 指定的編碼,如果沒有指定,就使用 iso-8859-1 的。
可以看到我們在 ie 中看到的結果是一樣的。
下面我們將 <%@ page contentType="text/html; charset=Shift_JIS" %> 去掉。
結果:
console ( 这个时候 , Console 的編碼是 GB2312 , 所以 编码为 GB2312 的字符能显示 , 由于 在 jsp 中 构造的 String 此時使用的 iso-8859-1, 所以不能 显示 )
name1 is GB2312 你好
name is ISO-8859-1????
name2 1 is ???? 你好 /name2 的编码此时为 iso-8859-1, 所以转化来的 name21 是正确的
????????
ie ( 这个时候 , response 的 编码 是 iso-8859-1, 所以 编码为 iso-8859-1 的能 显示 , 由于在 jsp 中 构造 的 String 此時使用的 iso-8859-1, 所以也能 显示 )
name1 is GB2312 ??
name is ISO-8859-1 你好
name2 1 is 直接 ???????????????????
我们大家
顯然不一樣了結果!!!!