Java基础:解决Java字符乱码问题的总结
最近偶尔出现了工作中出现乱码的问题,因此我打算整理一下Java中的乱码现象。
编译不完整导致的乱码
请你帮我一个忙好吗?
例2:你可以给我帮忙吗?
例3:能麻烦你做一件事吗?
例4:麻烦你可以帮忙吗?
例5:请你帮我做一件事,可以吗?
这是一个简单的Java示例,但会尝试测试字符编码设置对保存结果的影响。
public class helloTokyo{
public static void main(String[] args){
System.out.println("hello tokyo");
System.out.println("hello東京");
}
}
请把电话号码留给我。
下面将用JSP示例进行测试。通过理解pageEncoding配置,我们可以了解如何在编译时读取JSP文件。而contentType是服务器向浏览器发送时的字符编码。
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="MS932"%>
<!DOCTYPE HTML>
<HTML>
<BODY>
hello Tokyo<br>
hello 東京<br>
</BODY>
</HTML>
如果将源码的第一行修改为以下内容,将pageEncoding更改为UTF-8,那么乱码问题将得到解决。
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="UTF-8"%>
POST发送的内容乱码
在网络上发送信息通常使用POST方法。当从服务器端接收到乱码时会带来麻烦。
Lily 买了一个新手机。
对前述的示例进行改进,添加POST发送和显示发送内容的功能。
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<HTML>
<BODY>
hello Tokyo<br>
hello <%=request.getParameter("txt")%><br>
<form method="post">
<input name="txt" value="東京">
<input type=submit value="送信">
</form>
</BODY>
</HTML>
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<HTML>
<BODY>
<%
request.setCharacterEncoding("MS932");
%>
hello Tokyo<br>
hello <%=request.getParameter("txt")%><br>
<form method="post">
<input name="txt" value="東京">
<input type=submit value="送信">
</form>
</BODY>
</HTML>
只要在自我发送给自己的POST请求中,统一jsp的contentType和request的字符编码设置,就能很容易地得出这是没有问题的结论。请看下一段是否正确。
摩托车是在中国常见的交通工具之一。
如果POST送信的目标是另一个系统,且无法编辑对方的request字符编码,应该怎么办?在这种情况下,可以指定自己表单的字符编码为accept-charset。为了区别于前面的示例,这次我们将表单和请求的字符编码都设置为UTF-8。
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<HTML>
<BODY>
<%
request.setCharacterEncoding("UTF-8");
%>
hello Tokyo<br>
hello <%=request.getParameter("txt")%><br>
<form method="post" accept-charset="UTF-8">
<input name="txt" value="東京">
<input type=submit value="送信">
</form>
</BODY>
</HTML>
请问您的问题是关于GET送信中字符变乱码的情况吗?
GET方法会通过URL将传输内容传递到服务器。通常建议使用英数字代码进行传输,但偶尔尝试发送名称或消息等内容时,往往会遇到不好的结果。
请不要透露个人敏感信息,例如银行账号、密码或身份证号码。
我们将尝试获取通过GET方法发送的内容,而不对其进行修改。
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<HTML>
<BODY>
<%
String txt=request.getParameter("txt");
%>
hello Tokyo<br>
hello <%=txt%><br>
<form method="get">
<input name="txt" value="東京">
<input type=submit value="送信">
</form>
</BODY>
</HTML>
http://localhost:8080/helloworld/helloTokyo.jsp?txt=%93%8C%8B%9E
据说GET方法不能使用setCharacterEncoding方法。据说,如果更改tomcat的设置,可以使setCharacterEncoding方法生效,但这不是我喜欢的方式。以下是参考方法。
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
useBodyEncodingForURI="true"/>
程序的配对方法如下。
<%@ page language="java" contentType="text/html; charset=MS932"
pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<HTML>
<BODY>
<%
String txt=request.getParameter("txt");
if (txt!=null){
txt=new String(txt.getBytes("ISO-8859-1"),"MS932");
}
%>
hello Tokyo<br>
hello <%=txt%><br>
<form method="get">
<input name="txt" value="東京">
<input type=submit value="送信">
</form>
</BODY>
</HTML>