关于pageContext.getOut().write(message)的默认编码及编码设置问询
关于
pageContext.getOut().write()编码的问题解答 嘿,我来帮你理清这两个JSP输出编码相关的问题:
1. 如何为pageContext.getOut().write(message)设置编码?
pageContext.getOut()返回的是JspWriter对象,它的编码规则和HTTP响应的编码是绑定的,常用的设置方式有这几种:
通过JSP页面指令直接指定:这是最省心的方式,在JSP页面最顶部添加页面指令,同时指定内容类型和编码:
<%@ page contentType="text/html; charset=UTF-8" %>这个指令会同时设置响应的
Content-Type头,以及JspWriter的输出编码,既能保证写出的内容用指定编码处理,也会告诉浏览器用该编码解析页面。通过ServletResponse API动态设置:如果需要在脚本逻辑里灵活指定编码,一定要在获取
JspWriter之前先设置响应编码:// 必须在调用getOut()之前执行 pageContext.getResponse().setCharacterEncoding("UTF-8"); // 之后再输出内容 pageContext.getOut().write("需要输出的内容");注意顺序不能搞反,否则编码设置不会生效。
2. pageContext.getOut().write(message)的默认编码是什么?如何设置其他编码?
默认编码情况
默认编码取决于你用的Servlet容器(比如Tomcat、Jetty)的配置,以及JSP页面的默认设置。以Tomcat为例,默认编码是ISO-8859-1(也就是Latin-1)——如果你的JSP页面没显式指定contentType,容器会自动给响应加上text/html; charset=ISO-8859-1的头,此时getOut().write()就会用这个编码处理输出。
设置其他编码的方法
除了上面的两种方式,还有全局统一配置的方案,适合整个Web应用统一编码:
- 通过web.xml配置编码过滤器:添加一个过滤器统一处理所有响应的编码,这样所有JSP的
JspWriter都会自动使用指定编码:
要是不用Spring,也可以自己写个简单的Filter,在<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>doFilter方法里调用response.setCharacterEncoding()就行。
如果需要切换到其他编码(比如GBK、UTF-16),只要把上述方法里的UTF-8换成Java支持的标准字符集名称就可以了。
内容的提问来源于stack exchange,提问作者Nico_99




