如何在对UTF-8的回复中设置默认字符编码?
我试过这个
System.setProperty("file.encoding", "UTF-8");
和这个
System.setProperty("org.eclipse.jetty.util.UrlEncoding.charset", "utf-8");
两者都没有任何效果 - 仍然会使用标题
发送回复Content-Type: text/html; charset=ISO-8859-1
我想对所有text / html响应执行此操作,理想情况下是代码而不是XML。我正在使用Jetty 9。
答案 0 :(得分:2)
Jetty文档声称它默认使用UTF-8,但这似乎是个谎言。如果您执行正常response.getWrite().println("Hello")
,则内容编码将按如下方式确定。
org/eclipse/jetty/http/encoding.properties
: // MimeTypes.java:155
ResourceBundle encoding = ResourceBundle.getBundle("org/eclipse/jetty/http/encoding");
Enumeration<String> i = encoding.getKeys();
while(i.hasMoreElements())
{
String type = i.nextElement();
__encodings.put(type,encoding.getString(type));
}
默认文件是:
text/html = ISO-8859-1
text/plain = ISO-8859-1
text/xml = UTF-8
text/json = UTF-8
Response.getWriter()
尝试使用该地图,但默认为ISO-8859-1 @Override
public PrintWriter getWriter() throws IOException
{
if (_outputType == OutputType.STREAM)
throw new IllegalStateException("STREAM");
if (_outputType == OutputType.NONE)
{
/* get encoding from Content-Type header */
String encoding = _characterEncoding;
if (encoding == null)
{
encoding = MimeTypes.inferCharsetFromContentType(_contentType);
if (encoding == null)
encoding = StringUtil.__ISO_8859_1;
setCharacterEncoding(encoding);
}
因此,您可以看到,对于text/html
,它不会默认为UTF-8。我不认为有一种方法可以改变代码的默认值。您可以做的最好的事情是将encoding.properties
文件更改为:
text/html = UTF-8
text/plain = UTF-8
text/xml = UTF-8
text/json = UTF-8
但即便如此,如果发现其中没有编码,也会默认为ISO-8859-1。
答案 1 :(得分:1)
response.setCharacterEncoding("UTF-8");
答案 2 :(得分:1)
我为一个遗留应用程序创建了字符编码过滤器。
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if(req instanceof Request){
req.setCharacterEncoding("UTF-8");
}
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void destroy() {
}
}
在web.xml中,filter-mapping的url-pattern为/ *。这将通过CharacterEncodingFilter路由来自Web应用程序的所有请求。
<filter>
<display-name>CharacterEncoding</display-name>
<filter-name>CharacterEncoding</filter-name>
<filter-class>my.app.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
答案 3 :(得分:0)
使用Writer();
时很重要对我来说如果我写
resp.getWriter().println("Return");
resp.setContentType("text/html; charset=UTF-8");
我不会工作
但如果我改变了序列
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().println("Return");
没关系
答案 4 :(得分:0)
例如,您可以将默认的UTF-8
字符集更改为ISO-8859-1
。
文档没有明确说明9.3版以后的版本的哪个参数名称。
在9.3之前是org.eclipse.jetty.util.URI.charset
对于新版本,它已更改为org.eclipse.jetty.util.UrlEncoding.charset
这是一个示例:
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.15.v20190215</version>
<configuration>
<systemPropertiesFile>src/main/config/jetty/encode.properties</systemPropertiesFile>
<jettyXml>src/main/config/jetty/jetty-env.xml</jettyXml>
</configuration>
</plugin>
encode.properties的内容
org.eclipse.jetty.util.UrlEncoding.charset=ISO-8859-1