java 中文乱码问题 utf-8和gbk的区别

我在写servlet小程序的时候,遇到一个问题。比方说
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

private static final long serialVersionUID = 6189969869246489166L;

public void doPost(HttpServletRequest aHSRequest, HttpServletResponse aHSResponse)
throws ServletException, IOException {

aHSResponse.setContentType("text/html;charset=utf-8");
PrintWriter pW = aHSResponse.getWriter();
pW
.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
pW.println("<HTML>");
pW.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
pW.println(" <BODY>");
aHSRequest.setCharacterEncoding("utf-8");
pW.print(" <h1 align='center'> 注册成功 </h1> ");
pW.println(" <hr color='#3300FF' size='3'> ");
pW.print("您的用户名为:" + aHSRequest.getParameter("UserName")+"<br>");
pW.print("您的密码为:" + aHSRequest.getParameter("Password"));
pW.println(" </BODY>");
pW.println("</HTML>");
pW.flush();
pW.close();
}

}

结果还是出现了乱码。但是把utf-8改成gbk就好了。哪位仁兄来解释下。

我用的是myeclipse。web.xml如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/LoginServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

第1个回答  推荐于2018-02-27
这其中存在一个转换问题:
如System.out.println(new String("中国".getBytes("gbk"), "utf-8"));
System.out.println(new String("中国".getBytes("utf-8"), "gbk"));
//将“中国“的gbk编码格式按着utf-8解析,或者反过来都会出现乱码。
如浏览器当前为gbk编码,就以gbk编码格式来提交。 这本身是不会出现乱码的,问题就出在Web服务器接收数据的时候,HttpServletRequest在将客户端传来的数据转成ucs2码上出了问题。在默认情况下,是按着iso-8859-1编码格式来转的,而这种编码格式并不支持中文,所以也就无法正常显示中文了,解决这个
问题的方法是用和客户端浏览器当前编码格式一致的编码来转换,如果是utf-8,则在doPost方法中应该用以下的语句来处理:
request.setCharacterEncoding("utf-8");本回答被提问者和网友采纳
第2个回答  2015-12-11
字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。

至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8节省空间。

GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。

GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准(好像还不是国家标准)
UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛,GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大
第3个回答  2008-09-10
关注
专家
第4个回答  2008-09-10
我刚才使用过 将GBK转换成UTF-8会出现乱码 我是先拆后组 可能是两种类型不能适应吧 如果可以的话 尽量用GBK
相似回答