ページエンコーディングがISO-8859-1
であるJSP
ページがあります。このJSPページは質問回答ブログにあります。 Q/A投稿中に特殊文字を含めたい。
問題は、UTF-8
からISO-8859-1
に変更しても、JSPはUTF-8
エンコーディングをサポートしていないことです。これらの文字(~
、%
、&
、+
)は問題を起こしています。これらのキャラクターを個別に、または任意のキャラクターの組み合わせで投稿すると、データベース内でnull
になり、アプリケーションの投稿中にこれらのキャラクターを削除すると正常に機能します。
誰かが解決策を提案できますか?
この問題を回避するには、アプリケーションのすべてのレイヤーで同じエンコードを使用する必要があります。 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エンコーディングを変換する必要があります。
完全な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" />
また、Eclipseを使用している場合は、ファイルをUTF-8形式で記録する必要があります。ファイルを左クリックし、[プロパティ]、[チェックアウト]、[テキストファイルのエンコード]の順にクリックします。
また、「Ṁlike」などの文字を表示する際に問題が発生しました。web.xmlに以下を追加しました。
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
これにより、ヘッダー以外のページの問題が解決されました。これを解決するために多くの方法を試しましたが、私の場合は何もうまくいきませんでした。ヘッダーの問題は、ヘッダーjspページが別のjspに含まれていることでした。それで、インポートにエンコードを与え、それが私の問題を解決しました。
<c:import url="/Header1.jsp" charEncoding="UTF-8"/>
ありがとう
ファイルがUTF-8エンコーディングで保存済みであることを確認する必要があります。いくつかのプレーンテキストエディターでそれを行うことができます。 Notepad ++では、メニューでEncoding
--> Encode in UTF-8
。 Windowsのメモ帳(Save As
-> UTF-8のエンコード)。 Eclipseを使用している場合、ファイルのプロパティで設定できます。
また、問題がescapeそれらの文字である必要があるかどうかを確認してください。文字の1つが&
。
私はすべてのエンコーディングの問題を解決したエンコーディングフィルタを使用しました...
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>
このスレッドはあなたを助けることができます: リクエストパラメータを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");
これは一般的な問題です。
解決する最も簡単な方法の1つは、特殊文字がアクションレイヤー内に到達しているかどうかを確認し、Javaコードで特殊文字を変更することです。
アクションまたは他の任意のJava選択したレイヤー(ビジネスレイヤーのように)でこのキャラクターを表示できる場合は、 StringEscapeUtils.html #escapeHtml
エスケープを行った後。新しい文字列を使用して、DBに保存します。
これはhtmlの特殊文字です。なぜエンコードしないのですか?それをチェックしてください: http://www.degraeve.com/reference/specialcharacters.php
これはあなたを助けます。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
JSPで区切り文字として特殊文字を使用すると、同じ問題が発生しました。特殊文字がサーブレットに投稿されると、それらはすべて台無しになりました。次の変換を使用して問題を解決しました。
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>
そして、投稿された他のすべてのように。 ApacheのTomcatコネクタにURIEncoding="UTF-8"
を追加しました。それも助けた。
ここで説明されているように、Eclipse(これを使用する場合)にはweb.xmlのコピーがあり、Tomcat-Settingsが上書きされます。 BrokenUTF-8 URI Encoding in JSPs
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に変換する必要はありません。 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");
}