web-dev-qa-db-ja.com

JSPページでのUTF-8エンコーディング

ページエンコーディングがISO-8859-1であるJSPページがあります。このJSPページは質問回答ブログにあります。 Q/A投稿中に特殊文字を含めたい。

問題は、UTF-8からISO-8859-1に変更しても、JSPはUTF-8エンコーディングをサポートしていないことです。これらの文字(~%&+)は問題を起こしています。これらのキャラクターを個別に、または任意のキャラクターの組み合わせで投稿すると、データベース内でnullになり、アプリケーションの投稿中にこれらのキャラクターを削除すると正常に機能します。

誰かが解決策を提案できますか?

30
Shailendra

この問題を回避するには、アプリケーションのすべてのレイヤー同じエンコードを使用する必要があります。 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エンコーディングを変換する必要があります。

60
Jasper de Vries

完全な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形式で記録する必要があります。ファイルを左クリックし、[プロパティ]、[チェックアウト]、[テキストファイルのエンコード]の順にクリックします。

29
PbxMan

また、「Ṁ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"/>

ありがとう

12
Minu George

ファイルがUTF-8エンコーディングで保存済みであることを確認する必要があります。いくつかのプレーンテキストエディターでそれを行うことができます。 Notepad ++では、メニューでEncoding--> Encode in UTF-8。 Windowsのメモ帳(Save As-> UTF-8のエンコード)。 Eclipseを使用している場合、ファイルのプロパティで設定できます。

また、問題がescapeそれらの文字である必要があるかどうかを確認してください。文字の1つが&

5
J.A.I.L.

私はすべてのエンコーディングの問題を解決したエンコーディングフィルタを使用しました...

 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>
5
Dinanath Parit

このスレッドはあなたを助けることができます: リクエストパラメータを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");
5
Kleber Bernardo

これは一般的な問題です。

解決する最も簡単な方法の1つは、特殊文字がアクションレイヤー内に到達しているかどうかを確認し、Javaコードで特殊文字を変更することです。

アクションまたは他の任意のJava選択したレイヤー(ビジネスレイヤーのように)でこのキャラクターを表示できる場合は、 StringEscapeUtils.html #escapeHtml

エスケープを行った後。新しい文字列を使用して、DBに保存します。

4
Naveen Babu

これはhtmlの特殊文字です。なぜエンコードしないのですか?それをチェックしてください: http://www.degraeve.com/reference/specialcharacters.php

3
Lo Juego

これはあなたを助けます。

<%@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");
1
Vivek Saxena

すべてのヒントをありがとう。 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

0
leole

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 
0

ページのエンコードやその他は重要ではありません。 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");

                } 
0
mike oganyan