我这样就行了啊
1
2
3
4
5
6
7
8
9
10
11
|
<%@ page import="java.net.*" contentType="text/html;charset=utf-8"%>
<
html
>
<
head
>
<
title
>My JSP 'csdn.jsp' starting page</
title
>
</
head
>
<
body
>
<
br
>
<
a
href
=
"csdn2.jsp?name=<%=URLEncoder.encode("
中国", "utf-8")%>">查看</
a
><
br
>
</
body
>
</
html
>
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<%@ page contentType=
"text/html;charset=utf-8"
%>
<html>
<head>
<title>My JSP
'csdn.jsp'
starting page</title>
</head>
<body>
<br>
<%=
new
String(request.getParameter(
"name"
).getBytes(
"iso8859-1"
),
"utf-8"
)%>
<br>
</body>
</html>
|
1
2
3
|
String name = request.getParameter(
"name"
);
System.out.println(name);
//涓浗
System.out.println(URLDecoder.decode(name,
"utf-8"
));
//涓浗
|
你输出的是这个的话,也就是两个字符变成三个了,那也就是说把 UTF-8 的字符转成 GBK 了,
因为 UTF-8 采用三个字节表示一个普通的汉字而 GBK 采用两个,两个 UTF-8 汉字是 6 个字节,
被强制转成 GBK 的话就会变成三个字符。
出现这个问题的原因在于,URI 参数是使用 UTF-8 编码的,而在 server.xml 中的 Connector
里的 URIEncoding 属性被改成“GBK”了。你把它改回来,改成 UTF-8 就行了,那样使用
request.getParameter("name"); 可以直接得到正确的值。
如果你不想改动 server.xml 那就得转码,因为 Tomcat 默认的 URI 传输采用 ISO-8859-1 的编码。
new String(request.getParameter("name").getBytes("iso8859-1"), "utf-8")
经过前一个项目的实践,我发现java平台里其实所有编码的字符串都可以正常显示,代码例如下
String strDefalt = ""; String strDefaltEncode = ""; String strChangeEncode = ""; try { strDefalt = "我的心不乱"; strDefaltEncode = new String("我的心不乱".getBytes(),"gbk"); strChangeEncode = new String("我的心不乱".getBytes("shift-jis"),"shift-jis"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Default charsetName="+Charset.defaultCharset().name()); System.out.println("strDefalt="+strDefalt); System.out.println("strDefaltEncode="+strDefaltEncode); System.out.println("strChangeEncode="+strChangeEncode);�
运行结果为:
Default charsetName=GBK strDefalt=我的心不乱 strDefaltEncode=我的心不乱 strChangeEncode=我的心不乱�
第一个显示的charsetName是我想打出我自己的平台里java默认的编码类型。
从而推测出第二行所表示的也就是strDefalt的字符串的编码类型为gbk。
根据第二行的推测重新将汉字转码为gbk,从而确认平台的默认编码为gbk。
而第三行,是我通过字符串转码将汉字【我的心不乱】由gbk编码转换为【shift-jis】的编码。
�
如上所示,默认的gbk的编码和shift-jis编码的汉字都可以正常的显示出来的
证明的确在平台中不同编码的字符可以正确的显示出来。
�
�� 既然不同的汉字都可以正常的显示出来,那么我们为什么有字符串乱码的情况呢。
那么我们来简单的列举下,一般都是什么情况下会出现乱码呢,据我目前的项目经历,我的答案是从数据库中取字符和在���� web项目中request给我的字符,那么这2种情况,我可以归结为这不是我在程序中所定义的字符,这些字符都是我在外界取到的。众所周知,java的 输入输出都是byte流的,而我们所取到的字符都是java平台自己将byte数据通过平台默认的编码形式将byte转换为String的。所以在这种情 况下就会出现乱码。
�
知道了原理,那么解决问题也就很简单了,那就是在byte被转化为String之前指定它的编码形式就可以了。
但有些时候我们无法再平台转码之前指定编码形式,这种情况下也是有办法的。。呵呵,,看下如下代码。
�
�
String strDefalt = ""; String strDefaltEncode = ""; String strChangeEncode = ""; try { strDefalt = "我的心不乱"; strDefaltEncode = new String("我的心不乱".getBytes(),"iso-8859-1"); String temp = new String(strDefaltEncode.getBytes("iso-8859-1"),"gbk"); System.out.println("temp="+temp); strChangeEncode = new String(temp.getBytes("shift-jis"), "shift-jis"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Default charsetName="+Charset.defaultCharset().name()); System.out.println("strDefalt="+strDefalt); System.out.println("strDefaltEncode="+strDefaltEncode); System.out.println("strChangeEncode="+strChangeEncode);
�显示结果如下
temp=我的心不乱 Default charsetName=GBK strDefalt=我的心不乱 strDefaltEncode=?????????? strChangeEncode=我的心不乱
�除了第四行显示为乱码外,其他的都正常的显示了
乱码的原因是我将gbk编码的String错误的转化为了iso-8859-1编码所以出乱码了。
第四行字符正常显示的一个原因为我将乱码的String(也就是第四行所显示的String)还原为原先的Byte(组装成String之前的), 然后再用完好的Byte转化为默认编码形式的String(第一行所表示的String)。而最后一行就是将完好的String在转化为自己想要的 shift-jis的编码的String了
其转换的原理为所谓的转码其实也就是不同的字符编码的字符集的映射顺序不同。
比如在a编码中1281可能对应的是【我】而在b编码中1281对应的是【%】所以这就出先字符的乱码现象,
而将数字转化成字符,则首先要获得目的编码数字,在映射成相应的字符。上面的字符为默认的gbk码的数字(byte)被错误的映射成了iso- 8859-1字符,所以乱码了,要转换回来的话,首先要获得gbk的数字,所以将错误的iso-8859-1字符转换为iso-8859-1数字,然后再 用这gbk的数字转换成gbk的字符,再用gbk的字符转化为shift-jis的字符。
�
�
�
�
�
�
�
�