JSP页面中的UTF-8编码

Sha*_*dra 32 java jsp utf-8

我有一个JSP页面编码的页面ISO-8859-1.这个JSP页面有一个问题答案博客.我希望在Q/A发布期间包含特殊字符.

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

任何人都能提出一些解决方案吗

Jas*_*ies 66

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

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

要仅在JSP页面上设置编码,请将以下行添加到它们:

<%@ page contentType="text/html; charset=UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

配置数据库也使用相同的char编码.

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

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


Pbx*_*Man 29

完整的JSP标记应该是这样的,请注意pageEncoding:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Run Code Online (Sandbox Code Playgroud)

一些旧的浏览器也搞乱了编码.您可以使用HTML标记

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Run Code Online (Sandbox Code Playgroud)

此外,文件应以UTF-8格式记录,如果您使用Eclipse左键单击文件 - >属性 - >签出 - >文本文件编码.

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

小智 12

我还有一个问题,显示像"ṀŮ"这样的字符.我在web.xml中添加了以下内容.

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>
Run Code Online (Sandbox Code Playgroud)

这解决了除标题之外的页面中的问题.试过很多方法解决这个问题,在我的案例中没有任何效果.标题的问题是标题jsp页面包含在另一个jsp中.所以给了导入的编码,这解决了我的问题.

<c:import url="/Header1.jsp" charEncoding="UTF-8"/>
Run Code Online (Sandbox Code Playgroud)

谢谢


J.A*_*.L. 6

您必须确保使用UTF-8编码保存文件.您可以使用几个纯文本编辑器来完成.使用Notepad ++,即可以在菜单中选择Encoding- > Encode in UTF-8.即使使用Windows的记事本(Save As- >编码UTF-8),您也可以执行此操作.如果您使用的是Eclipse,则可以在文件的Properties中进行设置.

另外,检查问题是否必须转义这些字符.如果是你的问题,就像其中一个角色一样,这并不奇怪&.


rus*_*tyx 6

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

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

<%@page pageEncoding="UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

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

<%@page pageEncoding="UTF-8" %>
Run Code Online (Sandbox Code Playgroud)

或者,当使用带有(嵌入式)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>()));
    }
}
Run Code Online (Sandbox Code Playgroud)

为了让 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>
Run Code Online (Sandbox Code Playgroud)

要制作一个“可运行”的 .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>
   . . .
Run Code Online (Sandbox Code Playgroud)


Nav*_*abu 5

这是一个常见的问题。

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

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

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


小智 5

此线程可以帮助您:将 请求参数作为UTF-8编码的字符串传递

基本上:

request.setCharacterEncoding("UTF-8");
String login = request.getParameter("login");
String password = request.getParameter("password");
Run Code Online (Sandbox Code Playgroud)

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

var userInput = $("#myInput").val();            
var encodedUserInput = encodeURIComponent(userInput);
$("#hiddenImput").val(encodedUserInput);
Run Code Online (Sandbox Code Playgroud)

在课堂上恢复后:

String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8");
Run Code Online (Sandbox Code Playgroud)


小智 5

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

 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
        }

    }
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)


小智 2

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


归档时间:

查看次数:

140047 次

最近记录:

6 年,2 月 前