Response编码
tomcat服务器默认采用ISO(不支持中文)编码,浏览器默认采用GBK编码,为了统一,我们让服务器与客户端共同采用UTF-8。
package servlets;
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("GBK");
response.getWriter().print("你好");
}
//response.setCharacterEncoding("GBK")单方面改变了了服务器发送时的编码方式.
//改为GBK后与浏览器默认编码方式相同,不会产生乱码。
package servlets;
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().print("你好");
//setHeader不仅告诉浏览器采用何种方式解码发送的东西,还设置了服务器发送时的编码方式(相当于调用了上述的response.setCharacterEncoding("utf-8")
}
}
简化版本,推荐使用
package servlets;
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("你好");
}
}
Request编码
1.在地址栏中直接给参数(GBK),一般不用
2.在页面点链接或表单(追究到上一个请求,与响应编码有关,utf-8)
服务器接收客户端数据的编码问题
1.post请求:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Map<String,String[]>pramerters=request.getParameterMap();
{
for(String key:pramerters.keySet())
{
String []values=pramerters.get(key);
System.out.println(key+"="+Arrays.toString(values));
}
}
//在读取前调用 request.setCharacterEncoding("utf-8");
2.Get请求:
1.到Tomcat目录下的/conf/server.xml配置。(可移植性差,不建议使用)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URLEncoding="UTF-8"/>
//添加URLEncoding="UTF-8"后tomcat解析get请求时会使用utf-8.
2.逆操作
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name=request.getParameter("name");
byte[]temp=name.getBytes("ISO-8859-1");
name=new String(temp, "utf-8");
String password=request.getParameter("password");
temp=password.getBytes("ISO-8859-1");
password=new String(temp, "utf-8");
System.out.println("name="+name+" \r\n"+"password="+password);
}
//因为服务器初始时会使用ISO解码字节数据,所以我们先用ISO编码出原来的字节数据,再用UTF-8解码。
URL编码(字符编码之上再进行一次编码)
在客户端和服务器之间传递非英文要转换为网络适合的方式(URL编码)。
表单自动使用URL编码
服务器可以自动识别转换URL编码。
后期要将服务器中所有的GET请求加上URL编码
String urlcode=URLEncoder.encode(str,"utf-8")
//会得到%ff形式的数据