JSP乱码解决之 pageEncoding和contentType属性,UTF-8 GBK gb2312 详解

JSP乱码解决 之 pageEncoding和contentType属性,UTF-8 GBK gb2312 详解

jsp乱码解决

UTF-8编码是什么?

UTF-8 编码是一种被广泛应用的编码,这种编码致力于把全球的语言纳入一个统一的编码,目前已经将几种亚洲语言纳入。UTF 代表 UCS Transformation Format.

UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度。UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。对于超过一个字节长度的字符,才用以下编码规范:

左边第一个字节1的个数表示这个字符编码字节的位数,例如两位字节字符编码样式为 为:110xxxxx 10xxxxxx; 三位字节字符的编码样式为:1110xxxx 10xxxxxx 10xxxxxx.;以此类推,六位字节字符的编码样式为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。 xxx 的值由字符编码的二进制表示的位填入。只用最短的那个足够表达一个字符编码的多字节串。例如:

Unicode 字符: 00 A9(版权符号) = 1010 1001, UTF-8 编码为:11000010 10101001 = 0x C2 0xA9; 字符 22 60 (不等于符号) = 0010 0010 0110 0000, UTF-8 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0

 

GBK编码是什么?

GBK: 汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。 Microsoft简体版中文Windows 95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。

GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P- Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排 序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。

GB2312编码是什么?

GB2312-80(简称GB2312或GB80)的全称为《信息交换用汉字编码字符集—基本集》,由中国国家标准总局发布,于1981年5月实施。目前,通行于中国大陆和新加坡。

字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。

JSP pageEncoding和contentType属性


JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。

关于JSP页面中的pageEncoding和contentType两种属性的区别:

pageEncoding是jsp文件本身的编码

contentType的charset是指服务器发送给客户端时的内容编码

JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页,用的是contentType。

第一阶段 是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。

第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效

contentType的設定.

pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。

jsp文件不像.java,.java在被编译器读入的时候默认采用的是操作系统所 设定的locale所对应的编码。一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采 用的方法刚好可以让虚拟机得到正确的资料。

但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。

举个例子:  

<%@ page contentType="text/html;charset=utf-8" %>

大都会打印出乱码,因为我输入的“你好吗”是gbk的,但是服务器是否正确抓到“你好吗”不得而知。

但是如果更改为  

<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<%@page contentType="text/html"%> <%@page pageEncoding="GB2312"%> <%@page import = "java.sql.*" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>index</title> <script language="JavaScript" type="text/JavaScript"> <!-- function MM_reloadPage(init) { //reloads the window if Nav4 resized if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) { document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }} else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload(); } MM_reloadPage(true); //--> </script> <style type="text/css"> <!-- .url { font-weight: bold; color: #666666; background-position: center; } a:link { text-decoration: none; } a:visited { text-decoration: none; } a:hover { text-decoration: none; } a:active { text-decoration: none; } .STYLE18 { font-size: 18px; font-family: "楷体_GB2312"; } .STYLE19 {font-size: 14px} .STYLE20 { font-size: 24px; font-weight: bold; } .STYLE21 {font-size: 18px} .STYLE22 {font-size: 10px} .STYLE23 {font-size: 12px} .STYLE24 {font-size: 16px; } body,td,th { font-size: 12px; } --> </style> <% Object obj=session.getAttribute("access") ; if (obj==null) session.setAttribute("access","n") ; if(request.getParameter("adminid") !=null && request.getParameter("adminpwd") != null){ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:database"); Statement smt =con.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); String getpaperdata = "SELECT * FROM admin WHERE adminid='" + request.getParameter("adminid") + "' AND adminpwd='" + request.getParameter("adminpwd") + "'" ; ResultSet paperrs =smt.executeQuery(getpaperdata) ; if(paperrs.next()){ String adminid=paperrs.getString("adminid"); String adminpwd=paperrs.getString("adminpwd"); session.setAttribute("access","y") ; session.setAttribute("adminid",adminid) ; session.setAttribute("adminpwd",adminpwd) ; session.setAttribute("accessid",request.getParameter("adminid")) ; session.setMaxInactiveInterval(1800) ; response.sendRedirect("newslist.jsp") ; }else response.sendRedirect("wrong.jsp") ; } %> </head> <body bgcolor="#666666" text="#006E45" link="#006E45" vlink="#006E45" alink="#006E45" topmargin="0"> <table width="976" height="699" border="1" align="center" bordercolor="#000000" bgcolor="#CCCCCC"> <td height="125" colspan="3" bgcolor="#CCFF00"><marquee behavior="scroll" scrollamount="6" scrolldelay="1"><img src="images/c6.jpg" width="161" height="175"><img src="images/c7.jpg" width="161" height="175"><img src="images/c8.jpg" width="161" height="175"><img src="images/c9.jpg" width="161" height="175"><img src="images/c10.jpg" width="161" height="175"><img src="images/c11.jpg" width="161" height="178"></marquee></td> <tr> <td width="202" height="226" rowspan="2" bgcolor="#CCFF00"><div align="center" class="STYLE20"><font face="华文楷体">广<span class="STYLE18"></span>辉新闻网</font> </div> <table width="54%" border="0" align="center"> <tr> <td><img src="images/t.jpg" alt="LOGO" width="159" height="64" align="middle"></td> </tr> </table> <div align="center"><a href="http://ent.qq.com/" target="_parent">腾讯娱乐</a></div> <form action="" method="post" name="form1" target="_blank"> <table width="99%" height="104" border="1" align="center"> <tr> <td colspan="4"><div align="center" class="STYLE19"><strong>管理员登录</strong></div></td> </tr> <tr> <td width="29%" ><span class="STYLE23">账号</span></td> <td width="71%" ><input type="text" name="adminid" <% if(request.getParameter("adminid")!=null){ %> value ='<%=request.getParameter("adminid")%>' <%}%> size="16"></td> </tr> <tr> <td ><span class="STYLE23">密码</span></td> <td ><input type="password" name="adminpwd" <% if(request.getParameter("adminpwd")!=null){ %> value ='<%=request.getParameter("adminpwd")%>' <%}%> size="16"></td> </tr> <tr> <td height="26" colspan="4"> <table width="95%" border="0"> <tr> <td width="26%"> </td> <td width="30%"><input type="submit" value="登录" name="loginButton"></td> <td width="41%"><input type="reset" name="Submit" value="取消"></td> <td width="3%"> </td> </tr> </table> </td> </tr> </table> </form> </td> <td height="20" colspan="2" align="left" valign="top" bgcolor="#CCFF00"> <div align="left"> <p class="STYLE24"><strong>版主简介</strong> </p> </div></td> </tr> <tr> <td width="166" height="245" align="left" valign="top" bgcolor="#CCFF00"><img src="images/12.gif" width="166" height="242"></td> <td width="583" align="left" valign="top" bgcolor="#CCFF00"><p class="STYLE18">姓名:堵广辉<br> 性别:男<br> 生日:1988-02-02<br> 身高:178cm <br> 祖籍:河南新乡<br> 兴趣:运动,音乐,篮球<br> 最爱 忠爱的球队:凯尔特人<br> 热爱的球星: 加内特<br> 最喜爱的电影: 国王的演讲<br> 最喜爱的演员: 李念 <br> 最喜爱的乐队: 子曰<br> 最欣赏的歌手: 朴树<br> </p> </td> </tr> <tr> <td rowspan="2" bgcolor="#CCFF00"> <form action="messagesave.jsp" method="POST" target="_blank"> <div align="center"><strong></strong> </div> <table width="199" border="1" bordercolor="#CCCCCC"> <tr bgcolor="#000000"> <td height="19" colspan="2" bgcolor="#CCFF00"> <div align="center"><strong><font face="华文楷体"><a href="messagelist.jsp" target="_blank" class="STYLE21">游客留言板</a></font></strong></div></td> </tr> <tr> <td width="56" height="18" bgcolor="#CCFF00"><span class="STYLE23">姓名 </span></td> <td width="127" bgcolor="#CCFF00"><input type="text" size="18" name="name"></td> </tr> <tr> <td height="18" colspan="2" bgcolor="#CCFF00"><span class="STYLE23">内容:</span></td> </tr> <tr> <td height="148" colspan="2" bgcolor="#CCCCCC"> <textarea name="note" rows="8" cols="25"></textarea> </td> </tr> </table> <table width="43%" border="0" align="center"> <tr> <td width="35%"> </td> <td width="9%"><input name="submit" type="submit" value="提交"></td> <td width="17%"><input name="reset" type="reset" value="取消"></td> <td width="39%"> </td> </tr> </table> </form></p> </td> <td height="20" colspan="2" align="left" valign="top" bgcolor="#CCFF00"> <p><font face="黑体"><a href="newslist.jsp" target="_blank" class="STYLE24">新闻列表</a></font></p></td> </tr> <tr> <td height="224" colspan="2" valign="top" bordercolor="#000000" bgcolor="#CCFF00"> <span class="STYLE19"> <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:database"); Statement smt =con.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); String getplacarddata = "" ; %> <% String getnewsdata = "" ; getnewsdata = "SELECT * FROM news WHERE published = true " ; ResultSet newsrs =smt.executeQuery(getnewsdata) ;%> <% while(newsrs.next()){ String newsid =newsrs.getString("newsid") ; String newstitle =newsrs.getString("newstitle") ; %> <a href="news.jsp?newsid=<%=newsid%>"><%=newstitle%></a> [<%=newsrs.getString("publishdate")%>]<br> <%}%> </span></td> </tr> </table> <p align="center"><font color="#FFFFFF"><span class="STYLE22"><strong>173632005@qq.com </strong>建议使用:1024 * 768 分辨率</span></font></p> </body> </html> <%@page contentType="text/html"%> <%@page pageEncoding="GB2312"%> <%@page import = "java.sql.*" %> <%@page import ="java.util.*,java.io.*"%> <%@page import ="javax.activation.*"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>无标题文档</title> <style type="text/css"> <!-- body,td,th { color: #FFFFFF; font-size: 24px; } body { background-color: #66FFFF; background-image: url(images/c4.jpg); } --> </style></head> <body link="#000000" vlink="#000000" alink="#000000"> <% Object obj=session.getAttribute("access") ; if (obj==null) session.setAttribute("access","n") ; if(session.getAttribute("access").equals("n")) {%> <p>非法进入或页面超时,请重新登录…</p> <p><a href="index.jsp">返回</a> </p> <%}else{%> <% String editType=request.getParameter("editType"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:database"); Statement smt =con.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); String editSQL = "" ; String msgid = request.getParameter("msgid") ; editSQL = "DELETE FROM message WHERE " + "msgid=" + msgid ; smt.execute(editSQL) ; out.println("留言已删除!") ;%> <%response.setHeader("Refresh","1;url=messagelist.jsp");%> <%}%> </body> </html>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值