2012-10-04 5 views
22

Ich habe eine JSP Seite, deren Seitencodierung ISO-8859-1 ist. Diese JSP-Seite befindet sich in einem Frage-Antwort-Blog. Ich möchte während der Q/A-Buchung Sonderzeichen einfügen.UTF-8 Codierung in JSP Seite

Das Problem ist JSP unterstützt UTF-8 Codierung nicht einmal ich habe es von ISO-8859-1 zu UTF-8 geändert. Diese Zeichen (~, %, &, +) machen ein Problem. Wenn ich diese Zeichen entweder einzeln oder mit der Kombination eines beliebigen Zeichens poste, ist es in der Datenbank gespeichert null und wenn ich diese Zeichen während der Anwendung zu entfernen, funktioniert es gut.

Kann jemand eine Lösung vorschlagen?

+0

zeigen als der Code, den Sie die Daten empfangen, wie du speicherst es in db, wie du es von db nach jsp stellst – MaVRoSCy

+0

Es ist ein sehr langer Code, den ich hier nicht einfügen kann, aber ich kann dir den Fluss sagen. Der Benutzer gibt die Antwort für eine Frage von einer JSP-Seite (a.jsp) aus. Ich nehme den ganzen Wert zu einer tester.js Datei (am submit), dann gehen diese Werte zur versteckten jsp Seite, dann rufe ich die Java-Methode auf, um die Daten bekannt zu geben. Wenn ein Benutzer sendet (&&&&&&&), kommt der Wert bis zur Datei tester.js, aber nach dem Senden des Wertes an die versteckte jsp-Seite werden alle Werte null. (Nur im Fall von oben beschrieben, funktioniert Sonderzeichen-Rest gut). – Shailendra

+0

Bitte posten Sie die Methode von Tester.js, die die Einreichung behandelt – MaVRoSCy

Antwort

4

Sie müssen sicherstellen, dass die Datei mit UTF-8-Kodierung gespeichert worden ist. Sie können es mit mehreren Text-Editoren machen. Mit Notepad ++, d. H. Können Sie im Menü Encoding ->Encode in UTF-8 wählen. Sie können es auch mit dem Windows-Editor (Save As -> Encoding UTF-8) tun. Wenn Sie Eclipse verwenden, können Sie dies in den Eigenschaften der Datei festlegen.

Überprüfen Sie auch, ob das Problem ist, dass Sie diese Zeichen escape müssen. Es wäre nicht seltsam, dass Ihr Problem war, als einer der Charaktere ist &.

48

Sie sollen die gleiche Codierung auf alle Schichten Ihre Anwendung verwenden, um dieses Problem zu vermeiden. Es ist sinnvoll, ein filter, um die Codierung hinzuzufügen:

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

Um nur legen Sie die Codierung auf Ihren JSP-Seiten, fügen Sie diese Zeile zu ihnen:

<%@ page contentType="text/html; charset=UTF-8" %> 

Konfigurieren Sie Ihre Datenbank mit dem gleichen Zeichen verwenden Codierung auch.

Wenn Sie die Codierung einer Zeichenkette konvertieren müssen sehen:

Ich würde nicht HTML-codierten Text in Ihrer Datenbank zu speichern, empfehlen. Wenn Sie beispielsweise ein PDF (oder etwas anderes als HTML) generieren müssen, müssen Sie zuerst die HTML-Codierung konvertieren.

+0

Können Sie ein wenig mehr erklären, wie ich dieses Problem neu bin. wie wo Filter hinzufügen. – Shailendra

+0

Für detaillierte Informationen und ein Beispiel siehe http://stackoverflow.com/tags/servlet-filters/info –

3

Dies ist ein häufiges Problem.

Einer der einfachsten Wege zu lösen ist zu prüfen, ob das Sonderzeichen in die Action-Ebene reicht und dann das Sonderzeichen im Java-Code ändert.

Wenn Sie in der Lage sind, diesen Charakter in Aktion zu sehen oder eine andere Java-Schicht Ihrer Wahl (wie Business-Schicht), ersetzen Sie einfach das Zeichen mit HTML-Zeichen entspricht, die StringEscapeUtils.html#escapeHtml

Nachdem ich die Flucht mit. Verwenden Sie die neue Zeichenfolge, um in der DB zu speichern.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

Einige alte Browser Chaos zu mit der Codierung bis:

+0

Nun, ich habe Ihre Lösung, aber ich bin nicht in der Lage, den speziellen Charakter in der Business-Schicht selbst zu bekommen. Es wird in der JSP verloren, bevor es in die Java-Klasse kommt. – Shailendra

+0

@ShailendraDubey hmmm das Datum sollte in Form gewesen sein und die Action-Ebene erreicht haben, können Sie das überprüfen. Wenn es nicht kommt, können Sie einige Details des Codes oder einen Beispielcode eingeben (ohne die gesamte JSP einzubeziehen). –

24

Der vollständige JSP-Tag sollte auch so etwas, beachten Sie die pageencoding sein. Check out können Sie den HTML-Tag

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

Auch die Datei verwenden, sollte in UTF-8-Format aufgezeichnet werden, wenn Verwendung von Eclipse auf die File-> Einstellungen-> Linksklick -> Textdatei Codierung.

+1

"" ist ausreichend. – Timo

+0

Nicht in allen Fällen. Ex. Wenn Ihr Projekt nicht standardmäßig UTF-8 ist. [Doc hier] (http://docs.oracle.com/cd/B14099_19/web.1012/b14014/jspnls.htm#i1005593) – PbxMan

+1

Diese SeiteEncoding tat es für mich. Das Meta-Tag allein nicht. – Thomas

4

Dieser Thread kann Ihnen helfen: Passing request parameters as UTF-8 encoded strings

Grundsätzlich gilt:

request.setCharacterEncoding("UTF-8"); 
String login = request.getParameter("login"); 
String password = request.getParameter("password"); 

Oder Sie Javascript verwenden, um auf jsp-Datei:

var userInput = $("#myInput").val();    
var encodedUserInput = encodeURIComponent(userInput); 
$("#hiddenImput").val(encodedUserInput); 

und nach auf Klasse erholen:

String parameter = URLDecoder.decode(request.getParameter("hiddenImput"), "UTF-8"); 
+0

Außerdem habe ich den Parameter _URIEncoding = "UTF-8" _ in Tag _ _ von server.xml (in meinem Fall verwende ich Apache Tomcat) – dellasavia

+0

Diese Lösung ist in Ordnung, aber Sie könnten eine globale Konfiguration im Web hinzufügen. XML durch Hinzufügen eines CharacterEncodingFilter, folgen Sie einfach diesem Link [https://Stackoverflow.com/a/30276333](https://Stackoverflow.com/a/30276333) –

10

Ich hatte auch ein Problem mit der Anzeige von Schreibern wie "Ṁ Ů". Ich fügte meiner web.xml Folgendes hinzu:

<jsp-config> 
    <jsp-property-group> 
     <url-pattern>*.jsp</url-pattern> 
     <page-encoding>UTF-8</page-encoding> 
    </jsp-property-group> 
</jsp-config> 

Dies löste das Problem in den Seiten außer Header. Ich habe viele Wege versucht, dies zu lösen, und in meinem Fall hat nichts funktioniert. Das Problem mit Header war Header JSP-Seite ist von einem anderen JSP enthalten. Also gab die Codierung dem Import und das löste mein Problem.

<c:import url="/Header1.jsp" charEncoding="UTF-8"/> 

Dank

+0

Danke für diesen Hinweis. Dies wurde auch benötigt und scheint es zu vermeiden, die <% @ page pageEncoding = "UTF-8"%> in jede einzelne jsp-Datei zu schreiben (Problem war nur, dass diese Änderung erst nach zwei Neustarts von Tomcat und Browser wirksam wurde). Cache und nicht direkt ...) – leole

0

hatte ich das gleiche Problem mit Sonderzeichen als Trennzeichen auf JSP. Wenn die Sonderzeichen im Servlet gepostet wurden, wurden sie alle durcheinander gebracht. Ich löste das Problem, indem die folgende Konvertierung mit:

String str = new String (request.getParameter("string").getBytes ("iso-8859-1"), "UTF-8"); 
0

ich das Shell-Skript hinzufügen jsp-Dateien konvertieren von IS

#!/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 
3

I Codierfilter verwendet, die meine alle Codierung Problem gelöst ...

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 
     } 

    } 

in 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> 
0

Danke für alle Hinweise. Mit Tomcat8 habe ich auch einen Filter wie @Jasper de Vries geschrieben. Aber in den neueren Tomcats ist heutzutage bereits ein Filter implementiert, der im Tomcat-Web verwendet bzw. unkommentiert werden kann.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> 

Und wie alle anderen geschrieben; Ich habe die URIEncoding="UTF-8" zum Tomcat Connector in Apache hinzugefügt. Das hat auch geholfen.

Wichtig zu sagen, dass Eclipse-(wenn Sie diese verwenden), um eine Kopie seiner web.xml hat und überschreibt die Tomcat-Einstellungen, wie es hier erklärt wurde: Broken UTF-8 URI Encoding in JSPs

Verwandte Themen