Java 编码问题总结
一、实践原则
1、页面文件的保存格式做到与声明一致
如声明<%@ page language="java" pageEncoding="utf-8"%>,则该文件保存为utf-8格式
2、无论是Get、Post还是JavaScript直接调用,浏览器以页面文件指定的编码格式提交请求
3、JavaScript的方法如encodeURI、encodeURIComponent等使用utf-8格式编码数据
二、Http协议和Servlet规范
A、Http协议
1、Get 根据Http协议,Get方法中的uri、queryString等均为iso-8859-1编码格式
2、Post Post方法中可以使用其他的编码格式,如utf-8,默认为iso-8859-1
B、Servlet规范
1、ServletRequest
void setCharacterEncoding(String env); 该方法可以用于指定request body中数据的编码格式,Container根据此格式解析
注:该方法必须在取参数及获取输入流之前调用,否则无效,即getParamater(String key)和getReader()之前调用
2、ServletResponse
void setCharacterEncoding(String charset);该方法用于设置Container响应输出流的编码格式,但不指定响应内容格式,Servlet2.4+支持
void setContentType(String type);该方法用于指定响应内容格式,同时可以指定响应输出流格式,如下两种情况基本等效,不同在于使用A时,浏览器将使用默认编码,B将告诉浏览器使用指定编码:
A、setCharacterEncoding("utf-8"); setContentType("text/html");
B、setContentType("text/html; charset=UTF-8");
以上方法可以重复调用覆盖以前设置,但应该在输出之前,如调用getWriter();之前
三、服务器状况
当前的不少服务器对Servlet规范中 void setCharacterEncoding(String env);支持的不够好,毕竟国外厂商本语是English,可能没有实现该方法,即使调用了改方法,仍然使用默认的iso-8859-1解析
个人测试了如下服务器支持:
A、Apache-Tomcat-5.5.12
B、Apache-Tomcat-6.0.18
四、方案总结
A、统一编码方式,如使用utf-8,在服务器端用指定的编码格式解析数据(如果容器不支持,则手工转码),然后再指定输出格式
B、将要提交的英文以外格式的参数先进行转码再提交,如encodeURIComponent,服务器端通过URIDecoder解码(utf-8格式),处理完成后,或者指定输出流及内容格式为utf-8,或者转为gb2312,以iso-8859-1送回
Java编码总结
最新推荐文章于 2024-10-17 10:27:13 发布