我有一个JSP
页面编码的页面ISO-8859-1
.这个JSP页面有一个问题答案博客.我希望在Q/A发布期间包含特殊字符.
问题是JSP不支持UTF-8
编码,即使我已将其更改ISO-8859-1
为UTF-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左键单击文件 - >属性 - >签出 - >文本文件编码.
小智 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)
谢谢
您必须确保使用UTF-8编码保存文件.您可以使用几个纯文本编辑器来完成.使用Notepad ++,即可以在菜单中选择Encoding
- > Encode in UTF-8
.即使使用Windows的记事本(Save As
- >编码UTF-8),您也可以执行此操作.如果您使用的是Eclipse,则可以在文件的Properties中进行设置.
另外,检查问题是否必须转义这些字符.如果是你的问题,就像其中一个角色一样,这并不奇怪&
.
默认的 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)
这是一个常见的问题。
最简单的解决方法之一是检查特殊字符是否到达动作层内部,然后在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)
归档时间: |
|
查看次数: |
140047 次 |
最近记录: |