我有一个JSP
页面,其页面编码为ISO-8859-1
. 这个 JSP 页面在一个问答博客中。我想在 Q/A 发布期间包含特殊字符。
问题是 JSP 不支持UTF-8
编码,即使我已将其从 更改ISO-8859-1
为UTF-8
. 这些字符(~
, %
, &
, +
)有问题。当我单独或与任何字符组合发布这些字符时,它存储null
在数据库中,当我在发布应用程序时删除这些字符时,它工作正常。
任何人都可以提出一些解决方案吗?
您应该在应用程序的所有层上使用相同的编码以避免此问题。添加过滤器来设置编码很有用:
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 编码。
完整的 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,请左键单击文件->属性->签出->文本文件编码。
我在显示“Ṁ Ů”等字符时也遇到了问题。我将以下内容添加到了我的 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"/>
谢谢
JSR315 将默认的 JSP 文件编码指定为ISO-8859-1。这是 JSP 引擎用来读取 JSP 文件的编码,它与 servlet 请求或响应编码无关。
如果您的 JSP 文件中有非拉丁字符,请将 JSP 文件另存为带有 BOM 的 UTF-8 或pageEncoding
在 JSP 页面的开头设置:
<%@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 BootTomcatContextCustomizer
时,通过:
@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>
. . .
您必须确保使用 UTF-8 编码保存文件。您可以使用几个纯文本编辑器来完成。使用 Notepad++,即可以在菜单中选择Encoding
--> Encode in UTF-8
。您甚至可以使用 Windows 的记事本(Save As
--> 编码 UTF-8)来执行此操作。如果您使用的是 Eclipse,您可以在文件的 Properties 中设置它。
另外,检查问题是否在于您必须转义这些字符。你的问题并不奇怪,因为其中一个字符是&
.
我使用了编码过滤器,它解决了我所有的编码问题......
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>
这是一个常见的问题。
最简单的解决方法之一是检查特殊字符是否到达动作层内部,然后修改 java 代码中的特殊字符。
如果您能够在 Action 或您选择的任何其他 java 层(如业务层)中查看此字符,只需使用StringEscapeUtils.html#escapeHtml将字符替换为相应的 HTML 字符
做完逃跑后。使用新字符串保存到数据库。
该线程可以帮助您:将 请求参数作为 UTF-8 编码字符串传递
基本上:
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");
这将对您有所帮助。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
这是html中的特殊字符。你为什么不编码呢?看看: http: //www.degraeve.com/reference/specialcharacters.php
我在 JSP 上使用特殊字符作为分隔符时遇到了同样的问题。当特殊字符被发布到 servlet 时,它们都搞砸了。我通过使用以下转换解决了这个问题:
String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8");
感谢所有提示。使用 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
我添加了这个 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
页面编码或其他任何东西都无关紧要。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");
}