【问题标题】:UTF-8 encoding breaks JSP embedded with other than English CharactersUTF-8 编码会破坏嵌入非英文字符的 JSP
【发布时间】:2016-06-17 11:58:26
【问题描述】:

我正在尝试使用CharReponseWrapper(由我的过滤器调用)将其他内容附加到HttpServletResponse

为了支持中文和韩文等多种语言,我必须确保生成的内容(附加后)保留原始字符集和编码。因此,我通过调用super.getContentType() 获取字符集并对其进行解析以提取字符集。

例如,super.getContentType() 可能会返回 text/html; charset=UTF-8,我对其进行解析以提取 UTF-8

随后,我在创建PrintWriter 对象(包装OutputStreamWriter)时提供字符集。 (注:try/catch 为清楚起见省略)

CharResponseWrapper.java:

public class CharResponseWrapper extends HttpServletResponseWrapper
{
 ....
@Override
  public PrintWriter getWriter() 
  {

            String charEnc = getCharsetFromContentType(getContentType());
            if (charEnc != null) {
                pwriter = new PrintWriter(new OutputStreamWriter(getOutputStream(), charEnc), false);
            } else {
                pwriter = new PrintWriter(getOutputStream());
            }
          }
      return pwriter;
  }
 ....
}
  • 我有一个带有韩文文本的 JSP。
  • 在该 JSP 中指定了 contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"

JSP的出处:

 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
    out.println("한글자모 / 조선글");
%>
</body>
</html>

当我尝试使用韩语字符访问 JSP 时,我得到的 �� 很少?浏览器出现乱码。

但我得到的响应页面出现乱码,如下所示。

한글��?모 / 조선글

已编辑:我尝试在响应前面添加空字符串,但我仍然面临问题。

【问题讨论】:

  • 如果前面加了一些字符(比如空格)还是一样的韩文字符有关吗?可能是某个 servlet 过滤器具有固定块大小的缓冲区,并且在其边界上无法正确处理多字节序列。如果它总是相同的字符,那么我不明白:U+c790 = UTF-8 [ec 9e 90] 似乎并不特别。就像一个压缩过滤器,它缓冲前 256 个字节以检查压缩是否有益。

标签: java jsp utf-8 character-encoding servlet-filters


【解决方案1】:

内容似乎没有编码,您可以尝试出于测试目的使用编码类型UTF8预编译您的jsp并将文件放在您的应用程序类文件夹中而不是jsp的。

【讨论】:

  • 我检查了Tomcat工作文件夹中的java文件,它是jsp的编译版本。 java文件是UTF-8编码的,里面的韩文字符编码正确。
  • 基本上你需要在所有层中使用相同的编码,从jsp页面到请求,响应对象。如果你使用eclipse保存文件然后检查,左键单击文件->属性->签出->文本文件编码。如果它不能解决,你可以有一个过滤器来编码所有的请求,比如
  • public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException { request.setCharacterEncoding("UTF-8");链.doFilter(请求,响应); }
  • 我检查了JSP文件的编码。它的UTF-8。我也试过request.setCharacterEncoding("UTF-8"); 也没有工作。您是否在您的环境中模拟了这个问题?你有工作代码吗?请发送并帮助我。
  • 我们以前是把class文件预编译并放在项目的classes文件夹下,而不是直接放置jsp的。
猜你喜欢
  • 2021-12-18
  • 2010-10-17
  • 2012-07-15
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
相关资源
最近更新 更多