有关浏览器和服务端字符乱码的问题
2008-08-28 00:25
281 查看
通过前两篇文章,我们已经基本搞清楚了几种字符编码之间的关系和方式,现在,我们来几种解决各种字符乱码等问题:
在d:盘分别建立三个文件。分别保存为三种编码方式:
a.txt:unicode,
b.txt:utf-8,
c.txt:ansi
程序如下:
package org.encode.demo;
import java.io.File;
import java.io.FileInputStream;
public class EncodeDemo {
public static void getString(String path,String encodeMethod){
File file = new File(path);
try {
FileInputStream is = new FileInputStream(file);
byte[] bs = new byte[255];
int endIndex = is.read(bs);
System.out.println();
String str = new String(bs, 0, endIndex,encodeMethod);
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
EncodeDemo.getString("d://a.txt","unicode");
EncodeDemo.getString("d://b.txt","utf-8");
EncodeDemo.getString("d://c.txt","gb2312");
}
}
分别能得到正确的字符;
看下列程序:
String str2="a";
byte[] bs2=str2.getBytes(encodeMethod);
System.out.println(bs2.length);
unicode:4
utf-8:1
gb2312:1
可见,utf-8相对于unicode是变长的;
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
大家好
</body>
</html>
用gb2312输出,到浏览器上访问的时候,我们能看到正常的中文;
当我们用uft-8输出的时候,浏览器根据输出编码类型,自动采用其相应的编码方式进行解码;
同样,servlet也是同样的道理:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
out.println("大家好");
}
从服务端到浏览器端,只要设置了编码方式,浏览器就会根据相应的编码方式来解码,这个过程是自动的;
现在我们可以讨论一下从浏览器端传送数据到服务端的编码问题,同时,这也是乱码出现最多的地方;
<body>
<form action="./charset" method="post">
name:<input type="text" name="name"/><br>
password<input type="password" name="pwd"/><br>
<input type="submit" value="提交" />
</body>
在index.jsp里面构造一个表单,表单里面填写中文,传入后台servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
PrintWriter out = response.getWriter();
out.println(name);
out.println(pwd);
}
index.jsp是utf-8的,那么上传的表单中的中文自然就是utf-8的编码;在firebug下我们可以见到:
Response Headers
Server Apache-Coyote/1.1
Content-Type text/html;charset=utf-8
Content-Length 323
Date Wed, 27 Aug 2008 15:48:41 GMT
Request Headers
Host 127.0.0.1:8080
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Cookie JSESSIONID=9A31884D9B5987C28D113A16B486EE53
反之将index.jsp设置成为gb2312的,那么表单中的字符编码就是gb2312的格式;
所以,我们后台在拿前台的数据的时候,必须知道前台传过来的数据是什么编码方式的,我们才能利用相应的解码方式:
如:
request.setCharsetEncoding("gb2312");
然后,我们可以利用request.setCharsetCoding("htf-8");
输出,在前台,我们必须手动把编码方式设置成为utf-8;所以说浏览器的自动选择解码方式是有一定的不可信赖性的;
但是输出unicode浏览器可以正确的选择;
有的时候,我们采用js lib的时候,比如ext,他里面采用了unicode ajax传递数据,那么,就不是怎么把页面设置成为gb2312就使用gb2312传
递表单数据啦
在d:盘分别建立三个文件。分别保存为三种编码方式:
a.txt:unicode,
b.txt:utf-8,
c.txt:ansi
程序如下:
package org.encode.demo;
import java.io.File;
import java.io.FileInputStream;
public class EncodeDemo {
public static void getString(String path,String encodeMethod){
File file = new File(path);
try {
FileInputStream is = new FileInputStream(file);
byte[] bs = new byte[255];
int endIndex = is.read(bs);
System.out.println();
String str = new String(bs, 0, endIndex,encodeMethod);
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
EncodeDemo.getString("d://a.txt","unicode");
EncodeDemo.getString("d://b.txt","utf-8");
EncodeDemo.getString("d://c.txt","gb2312");
}
}
分别能得到正确的字符;
看下列程序:
String str2="a";
byte[] bs2=str2.getBytes(encodeMethod);
System.out.println(bs2.length);
unicode:4
utf-8:1
gb2312:1
可见,utf-8相对于unicode是变长的;
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
大家好
</body>
</html>
用gb2312输出,到浏览器上访问的时候,我们能看到正常的中文;
当我们用uft-8输出的时候,浏览器根据输出编码类型,自动采用其相应的编码方式进行解码;
同样,servlet也是同样的道理:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
out.println("大家好");
}
从服务端到浏览器端,只要设置了编码方式,浏览器就会根据相应的编码方式来解码,这个过程是自动的;
现在我们可以讨论一下从浏览器端传送数据到服务端的编码问题,同时,这也是乱码出现最多的地方;
<body>
<form action="./charset" method="post">
name:<input type="text" name="name"/><br>
password<input type="password" name="pwd"/><br>
<input type="submit" value="提交" />
</body>
在index.jsp里面构造一个表单,表单里面填写中文,传入后台servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
PrintWriter out = response.getWriter();
out.println(name);
out.println(pwd);
}
index.jsp是utf-8的,那么上传的表单中的中文自然就是utf-8的编码;在firebug下我们可以见到:
Response Headers
Server Apache-Coyote/1.1
Content-Type text/html;charset=utf-8
Content-Length 323
Date Wed, 27 Aug 2008 15:48:41 GMT
Request Headers
Host 127.0.0.1:8080
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language zh-cn,zh;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive 300
Connection keep-alive
Cookie JSESSIONID=9A31884D9B5987C28D113A16B486EE53
反之将index.jsp设置成为gb2312的,那么表单中的字符编码就是gb2312的格式;
所以,我们后台在拿前台的数据的时候,必须知道前台传过来的数据是什么编码方式的,我们才能利用相应的解码方式:
如:
request.setCharsetEncoding("gb2312");
然后,我们可以利用request.setCharsetCoding("htf-8");
输出,在前台,我们必须手动把编码方式设置成为utf-8;所以说浏览器的自动选择解码方式是有一定的不可信赖性的;
但是输出unicode浏览器可以正确的选择;
有的时候,我们采用js lib的时候,比如ext,他里面采用了unicode ajax传递数据,那么,就不是怎么把页面设置成为gb2312就使用gb2312传
递表单数据啦
相关文章推荐
- LED点阵显示,有关特殊国别(阿拉伯,希伯来,泰文)字符排版和乱码问题解决
- putty中文字符乱码问题
- 【Vegas原创】url传中文字符乱码问题~
- oracle 字符乱码问题之一
- 有关页面编码的控制问题,乱码如何解决
- WCF ajax调用,同一浏览器窗口的多个请求在服务端阻塞,只能顺序执行的问题
- 由于浏览器版本造成的HttpServlet获取request请求对象中含中文乱码问题
- cx_Oracle 中文汉字乱码有关问题解决
- 有关浏览器兼容样式问题
- ReadString在UNICODE下中文乱码的解决办法(Char型字符和Unicode字符的转换问题)
- 问题(一)记录:Redhat9 Linux下字符界面乱码解决方法
- Git Bash中 log输出乱码的问题/文末收集了有关的博文
- 遇到的问题---jsp的ajax请求相同页面,服务端更新后浏览器仍然显示第一次的内容
- JAVA的中文字符乱码问题
- Filter应用之解决全站字符乱码问题
- JSP页面编码问题研究三(中文字符乱码问题的解决方法)
- 解决FF浏览器和IE下载文件乱码问题
- 关于解决从浏览器输入中文,经过web容器解析到达servlet中来出现的乱码问题
- 一个被忽略的可能 会出现乱码问题的地方,tomcat 字符配置
- GB2312编码的文件目录名在浏览器中乱码问题