【问题标题】:UTF-8 encoding in JSP page [duplicate]JSP页面中的UTF-8编码[重复]
【发布时间】:2012-09-25 06:10:37
【问题描述】:

我有一个JSP 页面,其页面编码为ISO-8859-1。这个 JSP 页面在一个问答博客中。我想在 Q/A 发布期间包含特殊字符。

问题是 JSP 不支持 UTF-8 编码,即使我已将其从 ISO-8859-1 更改为 UTF-8。这些字符 (~,%,&,+) 有问题。当我单独或与任何字符组合发布这些字符时,它在数据库中是 storinh null 并且当我在发布应用程序时删除这些字符时它工作正常。

任何人都可以提出一些解决方案吗?

【问题讨论】:

  • 显示为您接收数据的代码,如何将其存储到 db,如何将其从 db 显示到 jsp
  • 这是一个很长的代码,我不能在这里粘贴,但我可以告诉你流程。用户正在从 jsp 页面 (a.jsp) 发布问题的答案。我将所有值放入 tester.js 文件(提交时),然后这些值将转到隐藏的 jsp 页面,然后我调用 java 方法来发布数据。如果用户正在发布(&&&&&&&),则该值将到达 tester.js 文件,但在将值发送到隐藏的 jsp 页面后,所有值都变为空。(仅在上述情况下描述特殊字符其余工作正常)。
  • 请贴出tester.js处理提交的方法

标签: java jsp utf-8


【解决方案1】:

您应该在应用程序的所有层上使用相同的编码以避免此问题。添加filter 来设置编码很有用:

public void doFilter(ServletRequest request,
                     ServletResponse response,
                     FilterChain chain) throws ServletException {
   request.setCharacterEncoding("UTF-8");
   chain.doFilter(request, response);
}

要仅在 JSP 页面上设置编码,请在其中添加以下行:

<%@ page contentType="text/html; charset=UTF-8" %>

将您的数据库配置为也使用相同的字符编码。

如果您需要转换字符串的编码,请参见:

我不建议在您的数据库中存储 HTML 编码的文本。例如,如果您需要生成 PDF(或 HTML 以外的任何内容),则需要先转换 HTML 编码。

【讨论】:

【解决方案2】:

完整的 JSP 标签应该是这样的,还要注意 pageEncoding:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

一些旧浏览器也搞乱了编码。您可以使用 HTML 标签

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

另外,文件要以UTF-8格式记录,如果你使用Eclipse的话,左键点击文件->属性->签出->文本文件编码。

【讨论】:

  • 那个 pageEncoding 为我做了。单独的元标记没有。
  • 根据 JSP 2.1 规范第 1-50 页,如果不存在 pageEncoding,则 JSP 容器将使用 contentType 中存在的任何值。我将此解释为意味着contentType="text/html; charset-UTF-8 就足够了,pageEncoding="UTF-8" 是允许的,但不是必需的。请注意,无论哪种方式,这都只是设置返回的 HTTP 标头; &lt;meta&gt; 标签适用于忽略 HTTP 标头的旧版浏览器。 (原始答案中的区别并不明确。)
【解决方案3】:

我在显示诸如“Ṁ Ů”之类的字符时也遇到了问题。我在 web.xml 中添加了以下内容。

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

这解决了除页眉以外的页面中的问题。尝试了很多方法来解决这个问题,但在我的情况下没有任何效果。 header 的问题是 header jsp 页面包含在另一个 jsp 中。所以给了导入编码,这解决了我的问题。

<c:import url="/Header1.jsp" charEncoding="UTF-8"/>

谢谢

【讨论】:

  • 感谢您的提示。这也是需要的,并且似乎避免在每个 jsp 文件中写入 (在我的情况下,唯一的问题是此更改仅在 Tomcat 和浏览器两次重新启动后才生效 -缓存而不是直接...)
  • 仅使用 Java Config 查找没有 的解决方案。请看我的回答here
【解决方案4】:

JSR315 将默认的 JSP 文件编码指定为 ISO-8859-1。这是 JSP 引擎用来读取 JSP 文件的编码,它与 servlet 请求或响应编码无关。

如果您的 JSP 文件中有非拉丁字符,请将 JSP 文件另存为带有 BOM 的 UTF-8 或在 JSP 页面的开头设置 pageEncoding

<%@page pageEncoding="UTF-8" %>

但是,您可能希望将所有 JSP 页面的默认值全局更改为 UTF-8。这可以通过web.xml 完成:

<jsp-config>
    <jsp-property-group>
        <url-pattern>/*</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

或者,当使用带有(嵌入式)Tomcat 的 Spring Boot 时,通过TomcatContextCustomizer

@Component
public class JspConfig implements TomcatContextCustomizer {
    @Override
    public void customize(Context context) {
        JspPropertyGroup pg = new JspPropertyGroup();
        pg.addUrlPattern("/*");
        pg.setPageEncoding("UTF-8");
        pg.setTrimWhitespace("true"); // optional, but nice to have
        ArrayList<JspPropertyGroupDescriptor> pgs = new ArrayList<>();
        pgs.add(new JspPropertyGroupDescriptorImpl(pg));
        context.setJspConfigDescriptor(new JspConfigDescriptorImpl(pgs, new ArrayList<TaglibDescriptor>()));
    }
}

要让 JSP 与 Spring Boot 一起使用,请不要忘记包含以下依赖项:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

要制作“可运行”的 .war 文件,请重新打包:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
   . . .

【讨论】:

    【解决方案5】:

    您必须确保文件以 UTF-8 编码保存。 您可以使用几个纯文本编辑器来完成。使用记事本++,即可以在菜单中选择Encoding-->Encode in UTF-8。即使使用 Windows 的记事本(Save As --> 编码 UTF-8),您也可以做到这一点。 如果您使用的是 Eclipse,则可以在文件的属性中进行设置。

    另外,检查问题是否在于您必须转义这些字符。你的问题并不奇怪,因为其中一个字符是&amp;

    【讨论】:

      【解决方案6】:

      我使用了编码过滤器,它解决了我所有的编码问题......

       package com.dina.filter;
      
          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;
      
          /**
           *
           * @author DINANATH
           */
          public class EncodingFilter implements Filter {
      
              private String encoding = "utf-8";
      
              public void doFilter(ServletRequest request,ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
                  request.setCharacterEncoding(encoding);
          //                response.setContentType("text/html;charset=UTF-8");
                          response.setCharacterEncoding(encoding);
                  filterChain.doFilter(request, response);
      
              }
      
              public void init(FilterConfig filterConfig) throws ServletException {
                  String encodingParam = filterConfig.getInitParameter("encoding");
                  if (encodingParam != null) {
                      encoding = encodingParam;
                  }
              }
      
              public void destroy() {
                  // nothing todo
              }
      
          }
      

      在 web.xml 中

          <filter>
              <filter-name>EncodingFilter</filter-name>
              <filter-class>
              com.dina.filter.EncodingFilter
              </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>
      

      【讨论】:

        【解决方案7】:

        这个帖子可以帮助你: Passing request parameters as UTF-8 encoded strings

        基本上:

        request.setCharacterEncoding("UTF-8");
        String login = request.getParameter("login");
        String password = request.getParameter("password");
        

        或者你在jsp文件上使用javascript:

        var userInput = $("#myInput").val();            
        var encodedUserInput = encodeURIComponent(userInput);
        $("#hiddenImput").val(encodedUserInput);
        

        在课堂上恢复后:

        String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8");
        

        【讨论】:

        • 此外,我在 server.xml 的标签 中添加了参数 URIEncoding="UTF-8" (在我的情况下,我使用 Apache Tomcat)
        • 这个解决方案很好,但是您可以通过添加 CharacterEncodingFilter 在 web.xml 中添加全局配置,只需点击此链接https://stackoverflow.com/a/30276333
        【解决方案8】:

        这是一个常见问题。

        最简单的解决方法之一是检查特殊字符是否到达动作层内部,然后修改 java 代码中的特殊字符。

        如果您能够在 Action 或您选择的任何其他 java 层(如业务层)中查看此字符,只需使用 StringEscapeUtils.html#escapeHtml 将字符替换为相应的 HTML 字符

        逃跑后。使用新字符串保存到数据库。

        【讨论】:

        • 好吧,我得到了你的解决方案,但我无法获得业务层本身的特殊字符。在进入 java 类之前,它在 jsp 中迷失了。
        • @ShailendraDubey 嗯,日期应该已经形成并到达了行动层,你可以仔细检查一下。如果不来,能否把代码的一些细节或一些示例代码(不包括整个JSP)。
        【解决方案9】:

        这会对你有所帮助。

        <%@page contentType="text/html" pageEncoding="UTF-8"%>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        </head>
        

        【讨论】:

          【解决方案10】:

          这是 html 中的特殊字符。你为什么不编码呢? 看看吧:http://www.degraeve.com/reference/specialcharacters.php

          【讨论】:

            【解决方案11】:

            我在 JSP 上使用特殊字符作为分隔符时遇到了同样的问题。当特殊字符被发布到 servlet 时,它们都搞砸了。我通过使用以下转换解决了这个问题:

            String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8");
            

            【讨论】:

              【解决方案12】:

              我添加了这个 shell 脚本来从 IS 转换 jsp 文件

              #!/bin/sh
              
              ###############################################
              ## this script file must be placed in the parent  
              ## folder of the to folders "in" and "out"
              ## in contain the input jsp files
              ## out will containt the generated jsp files
              ## 
              ###############################################
              
              find in/ -name *.jsp | 
                  while read line; do 
                      outpath=`echo $line | sed -e 's/in/out/'` ;
                      parentdir=`echo $outpath | sed -e 's/[^\/]*\.jsp$//'` ;
                      mkdir -p $parentdir
                      echo $outpath ;
                      iconv -t UTF-8 -f ISO-8859-1 -o $outpath $line ;
                  done 
              

              【讨论】:

                【解决方案13】:

                感谢所有提示。使用 Tomcat8,我还添加了一个过滤器,如 @Jasper de Vries 所写。但在现在较新的 Tomcat 中,已经实现了一个过滤器,可以在 Tomcat web.xml 中未注释的情况下使用它:

                <filter>
                    <filter-name>setCharacterEncodingFilter</filter-name>
                    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
                    <init-param>
                        <param-name>encoding</param-name>
                        <param-value>UTF-8</param-value>
                    </init-param>
                    <async-supported>true</async-supported>
                </filter>
                ...
                <filter-mapping>
                    <filter-name>setCharacterEncodingFilter</filter-name>
                    <url-pattern>/*</url-pattern>
                </filter-mapping>
                

                和所有其他人一样;我将URIEncoding="UTF-8" 添加到Apache 中的Tomcat 连接器。这也有帮助。

                重要的是,Eclipse(如果您使用它)具有其 web.xml 的副本并覆盖 Tomcat 设置,因为它在此处解释:Broken UTF-8 URI Encoding in JSPs

                【讨论】:

                  【解决方案14】:

                  页面编码或其他任何东西都无关紧要。 ISO-8859-1 是 UTF-8 的子集,因此您不必将 ISO-8859-1 转换为 UTF-8,因为 ISO-8859-1 已经是 UTF-8,是 UTF-8 的子集,但仍然是 UTF- 8. 另外,如果您在某处有双重编码,那么所有这些都不意味着什么。 这是我对所有与编码和字符集相关的东西的“包治百病”的秘诀:

                          String myString = "heartbroken ð";
                  

                  //字符串是双重编码的,先解决这个问题。

                                  myString = new String(myString.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
                                  String cleanedText = StringEscapeUtils.unescapeJava(myString);
                                  byte[] bytes = cleanedText.getBytes(StandardCharsets.UTF_8);
                                  String text = new String(bytes, StandardCharsets.UTF_8);
                                  Charset charset = Charset.forName("UTF-8");
                                  CharsetDecoder decoder = charset.newDecoder();
                                  decoder.onMalformedInput(CodingErrorAction.IGNORE);
                                  decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
                                  CharsetEncoder encoder = charset.newEncoder();
                                  encoder.onMalformedInput(CodingErrorAction.IGNORE);
                                  encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
                                  try {
                                      // The new ByteBuffer is ready to be read.
                                      ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(text));
                                      // The new ByteBuffer is ready to be read.
                                      CharBuffer cbuf = decoder.decode(bbuf);
                                      String str = cbuf.toString();
                                  } catch (CharacterCodingException e) {
                                      logger.error("Error Message if you want to");
                  
                                  } 
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2017-06-20
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-02-02
                    • 2013-05-07
                    • 2012-07-15
                    • 1970-01-01
                    • 2016-09-22
                    相关资源
                    最近更新 更多