问题:
BIG5网页上输入非BIG5字符,servlet如何处理才能得到正确的中文呢?
今天这个问题在平常很少会遇见,一般都是把网页的编码设计成统一的“UTF-8”或者“GBK”就可以,因为他们基本上包含了人们所要用到的所有字符编码。但是通过今天的学习,我不仅仅是把问题给解决了,同时也对GET和POST这两种网页数据提交方式更加的了解。下面,我们就来解决这个问题。
首先对“form表单提交数据编码方式和tomcat接受数据解码方式的思考。”
1.GET提交(非实体提交数据)
对于GET方法来说,都是把数据串联在请求的url后面作为参数。浏览器会对URL进行URL encode,然后发送给服务器。对于中文来说对于中文IE,如果在高级选项中选中总以UTF-8发送(默认方式),则PathInfo是URL Encode是按照UTF-8编码,QueryString是按照GBK编码。
URL的组成:
域名:端口/contextPath/servletPath/pathInfo?queryString
request.getParameter("name");
// 获得queryString的参数值(来自于get和post),其值经过Servlet服务器URL Decode过的
request.getPathInfo();
// 注意:pathinfo返回的字符串是经过Servlet服务器URL Decode过的。
requestURI = request.getRequestURI();
// 内容为:contextPath/servletPath/pathinfo 浏览器提交过来的原始数据,未被Servlet服务器URL Decode过。
对于中文的firefox,则pathInfo和queryString都是URL encode按照GBK编码的。
不同的浏览器以及同一浏览器的不同设置,都会影响最终URL中PathInfo的编码。URL中如果含有中文等非ASCII字符,则应该避免使用GET的提交方式。
2.POST提交(实体提交数据,在后台运行)
对于POST方式,也是要进行URL编码的。但是POST提交表单中的参数值是根据网页的编码(ContentType("text/html; charset=GBK")中指定的编码)进行对表单中的数据URL编码,然后发给服务器的。我们可以在服务器端的程序中设置Request.setCharacterEncoding()设置编码,然后去的争取的参数数据。
经过上述说明,值得注意的是GET提交数据的编码方式不依赖与网页的编码方式,而是依赖于浏览器端的URL编码,POST则是根据网页的编码进行数据编码,也就是说这样对URL及网页中的编码使用同一个编码是比较合适的。这样做的代码和工作效益都是最好的。
3.解决方式
网页的编码采用BIG5,在form表单提交时采用POST提交。
<form action="/day04/servlet/savaFile.do" method="post">
name:<input type="text" name="text" maxlength="20" size="20"/>
<br/><input type="submit" value="送出">
</form>
服务器端需要用到一个apache的commons-lang3-3.3.jar包。在对读取request请求数据进行同一编码设置后,获取文本框内容,然后利用StringEscapeUtils.unescapeHtml4(text),进行获取正确的值(text需要是HTML实体)。
request.setCharacterEncoding("BIG5");
String text= request.getParameter("text");;
String unescape = StringEscapeUtils.unescapeHtml4(text);