【问题标题】:Encoding with UTF-8 does not work in JSP使用 UTF-8 编码在 JSP 中不起作用
【发布时间】:2014-11-11 12:46:37
【问题描述】:

我使用下面的jsp来搜索一些文本:

<%@page session="false" contentType="text/html; charset=utf-8" %>
..
...
<form method="post"  action="searchPageAction.html">
    <input type="text" name="search_value"  value="ö-Test"/>
</form>

...

Servlet 如下所示:

public class SearchServlet {
private static final String SEARCH_VALUE = "search_value";

@Override
protected final void doPost(final SlingHttpServletRequest request, final SlingHttpServletResponse response) throws ServletException {
    try {
        request.setCharacterEncoding("UTF-8");
    } catch (UnsupportedEncodingException e1) {
        e1.printStackTrace();
    }
    String searchValue = request.getParameter(SEARCH_VALUE);
    String redirectPath = "/content/vrbp/de/tools/suchergebnis.html?q="+searchValue+"&_charset_=UTF-8";
    try {
        response.setCharacterEncoding("UTF-8");
        response.sendRedirect(redirectPath);
    } catch (IOException e) {

    } catch (IllegalStateException e) {
       }
}
}

现在当我搜索“ö-Test”时,浏览器中写入了以下链接:

http://www.testproject:4502/content/myProject/searchResult.html?q=%F6-Test&charset=UTF-8

我已经预料到了:

http://www.testproject:4502/content/myProject/searchResult.html?q=ö-Test&字符集=UTF-8

并且将 searchResult.html 中的文本 ö-Test 打印为 &amp;#65533;-Test。如何在UTF-8 中正确编码?我做错了什么?

【问题讨论】:

    标签: jsp servlets encoding character-encoding aem


    【解决方案1】:

    需要设置默认参数编码,可以通过Sling Main Servlet设置进行配置,即——

    http://localhost:4502/system/console/configMgr/org.apache.sling.engine.impl.SlingMainServlet
    

    最后一个选项,sling.default.parameter.encoding 应该设置为 UTF-8,否则它将回退到帮助文本中指定的默认值:

    用于将请求参数解码为字符串的默认请求参数编码。 如果未设置此属性,则默认编码为 Servlet API 规范要求的“ISO-8859-1”。如果“charset”请求,则使用此默认编码参数未设置为另一个(支持的)字符编码。确保始终使用相同编码(例如 UTF-8)的应用程序可以在此处设置此默认值,并且可以省略“charset”请求参数。

    为避免在每个环境的 Felix 控制台中手动执行此操作,you can add a sling:OsgiConfig node with these settings in your codebase,然后在部署您的代码时配置此设置。

    【讨论】:

    • 感谢您的回答。我已将选项 sling.default.parameter.encoding 设置为 UTF-8,但没有任何变化:(
    【解决方案2】:

    如果参数在查询字符串中没有正确显示,那么客户端代码可能没有正确设置编码。 ö-Test 的正确 URL 编码值将是 %C3%B6-Test,这就是您希望在查询字符串中看到的内容。一旦你得到正确显示,那么服务器端默认编码就会发挥作用。您希望在搜索该示例时看到这一点:

    http://www.testproject:4502/content/myProject/searchResult.html?q=%C3%B6-Test&charset=UTF-8
    

    当表单在浏览器中加载时,浏览器检测并选择使用什么编码来呈现页面?您可能需要添加适当的元标记:

    HTML 4.01:&lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt; HTML5:&lt;meta charset="UTF-8"&gt;

    或者试试&lt;%@ page pageEncoding="utf-8" %&gt;

    作为一个例子,我尝试了一个带有&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;的表单,结果查询字符串是%F6-Test但是当我使用&lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt;时,结果查询字符串是%C3%B6-Test所以这似乎表明浏览器中的编码不是正确。

    另外看看这个问题:$_POST will convert from utf-8 to ä ö ü etc 可能没有直接关系,但列出了一些需要考虑的因素。

    【讨论】:

    • 有效!
    【解决方案3】:

    这解决了我的问题

    searchValue= URLEncoder.encode(searchValue, "UTF-8");
    

    【讨论】:

      【解决方案4】:

      这对我有用:

      String(request.getParameter("q").getBytes("ISO-8859-1"))
      

      【讨论】:

      • 虽然这个答案可能是正确且有用的,但最好在其中附上一些解释来解释它如何帮助解决问题。如果有更改(可能不相关)导致它停止工作并且用户需要了解它曾经是如何工作的,这在未来变得特别有用。
      猜你喜欢
      • 2013-07-19
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多