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東京");
	}
}
image.png

请把电话号码留给我。

下面将用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>
image.png

如果将源码的第一行修改为以下内容,将pageEncoding更改为UTF-8,那么乱码问题将得到解决。

<%@ page language="java" contentType="text/html; charset=MS932"
 pageEncoding="UTF-8"%>
image.png

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>
image.png
<%@ 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>
image.png

只要在自我发送给自己的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>
image.png

请问您的问题是关于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>
image.png
http://localhost:8080/helloworld/helloTokyo.jsp?txt=%93%8C%8B%9E
image.png

据说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>
image.png

Tomcat控制台显示乱码

image.png
广告
将在 10 秒后关闭
bannerAds