2012-10-04 17 views
22

Ho una pagina JSP cui codifica della pagina è ISO-8859-1. Questa pagina JSP è contenuta in un blog con domanda di risposta. Voglio includere caratteri speciali durante la registrazione di Q/A.UTF-8 codifica JSP pagina

Il problema è che JSP non supporta la codifica UTF-8 anche se l'ho modificato da ISO-8859-1 a UTF-8. Questi caratteri (~, %, &, +) stanno creando problemi. Quando sto postando questi caratteri individualmente o con la combinazione di qualsiasi carattere, è archiviato nel database null e quando rimuovo questi caratteri durante la pubblicazione dell'applicazione funziona correttamente.

Qualcuno può suggerire qualche soluzione?

+0

spettacolo come il codice ricevuto i dati, come lo memorizzi in db, come lo visualizzi da db a jsp – MaVRoSCy

+0

È un codice molto lungo che non posso incollare qui, ma posso dire il flusso. L'utente sta postando la risposta a una domanda da una pagina jsp (a.jsp). Sto prendendo tutto il valore di un file tester.js (su submit) quindi questi valori vanno alla pagina jsp nascosta, quindi sto chiamando il metodo java per pubblicare i dati. Se un utente sta postando (&&&&&&&) il valore arriverà fino al file tester.js ma dopo aver inviato il valore alla pagina jsp nascosta tutti i valori diventeranno nulli. (Solo nel caso di sopra descrivere il resto del carattere speciale funziona correttamente). – Shailendra

+0

si prega di inviare il metodo tester.js che gestisce l'invio – MaVRoSCy

risposta

4

È necessario assicurarsi che il file sia stato salvato con codifica UTF-8. Puoi farlo con diversi editor di testo in chiaro. Con Notepad ++, ad esempio, puoi scegliere nel menu Encoding ->Encode in UTF-8. Puoi anche farlo anche con il Blocco note di Windows (Save As -> Codifica UTF-8). Se si utilizza Eclipse, è possibile impostarlo nelle Proprietà del file.

Inoltre, controllare se il problema è che è necessario escape quei caratteri. Non sarebbe strano che fosse il tuo problema, dato che uno dei personaggi è &.

48

si dovrebbe usare la stessa codifica su tutti i livelli della vostra applicazione per evitare questo problema. E 'utile aggiungere un filter per impostare la codifica:

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

Per impostare solo la codifica sulle tue pagine JSP, aggiungere questa riga a loro:

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

Configurare il database per utilizzare lo stesso char codifica pure.

Se avete bisogno di convertire la codifica di una stringa vedi:

non mi consiglia di memorizzare HTML testo codificato nel database. Ad esempio, se è necessario generare un PDF (o qualcosa di diverso da HTML) è necessario convertire prima la codifica HTML.

+0

Puoi spiegare un po 'di più come sono nuovo a questo problema. come dove aggiungere il filtro. – Shailendra

+0

Per informazioni dettagliate e un esempio, vedere http://stackoverflow.com/tags/servlet-filters/info –

3

Questo è un problema comune.

uno dei modo più semplice di risolvere è quello di verificare se il carattere speciale sta raggiungendo all'interno dello strato azione e quindi modificare il carattere speciale nel codice Java.

Se siete in grado di visualizzare questo personaggio in azione o di qualsiasi altro livello java di vostra scelta (come strato di business), basta sostituire il carattere con corrispondenti caratteri HTML usando il StringEscapeUtils.html#escapeHtml

Dopo aver fatto la fuga. usa la nuova stringa per salvare nel DB.

+0

beh ho avuto la tua solista ma non sono in grado di ottenere il carattere speciale nel livello aziendale stesso. Si sta perdendo nel jsp prima di arrivare alla lezione di java. – Shailendra

+0

@ShailendraDubey hmmm la data dovrebbe essere nel modulo e ha raggiunto il livello di azione puoi ricontrollare su quello. se non viene, puoi inserire alcuni dettagli del codice o del codice di esempio (senza includere l'intero JSP). –

24

Il tag completo JSP dovrebbe essere qualcosa di simile, mente il pageEncoding troppo:

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

Alcuni vecchi browser pasticciare con la codifica troppo. è possibile utilizzare il tag HTML

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

anche il file deve essere registrato in formato UTF-8, se si utilizza Eclipse sinistro del mouse relative Controlla la file-> Proprietà-> - Codifica> File di testo.

+1

"" è sufficiente. – Timo

+0

Non in tutti i casi. Ex. se il tuo progetto non è UTF-8 per impostazione predefinita. [doc qui] (http://docs.oracle.com/cd/B14099_19/web.1012/b14014/jspnls.htm#i1005593) – PbxMan

+1

Quella pagina di codifica ha funzionato per me. Il meta tag da solo no. – Thomas

4

Questo thread può aiutare: Passing request parameters as UTF-8 encoded strings

In sostanza:

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

Oppure utilizzare javascript file JSP:

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

e dopo il recupero in classe:

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

Inoltre, ho aggiunto il parametro _URIEncoding = "UTF-8" _ nel tag _ _ di server.xml (nel mio caso, utilizzo Apache Tomcat) – dellasavia

+0

Questa soluzione va bene, ma è possibile aggiungere una configurazione globale nel web. xml aggiungendo un CharacterEncodingFilter, basta seguire questo link [https://stackoverflow.com/a/30276333](https://stackoverflow.com/a/30276333) –

10

Ho anche riscontrato un problema nella visualizzazione di caratteri come "Ṁ Ů". Ho aggiunto quanto segue al mio web.xml.

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

Questo ha risolto il problema nelle pagine tranne l'intestazione. Ho provato molti modi per risolvere questo e niente ha funzionato nel mio caso. Il problema con l'intestazione era l'intestazione, la pagina jsp è inclusa da un altro jsp. Quindi ha dato la codifica all'importazione e questo ha risolto il mio problema.

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

Grazie

+0

Grazie per questo suggerimento. Anche questo era necessario e sembra evitare di scrivere la <% @ page pageEncoding = "UTF-8"%> in ogni singolo file jsp (nel mio caso era solo un problema il fatto che questa modifica avesse effetto solo dopo due riavvii di Tomcat e Browser- Cache e non direttamente ...) – leole

0

Ho avuto lo stesso problema con i caratteri speciali come delimitatori in JSP. Quando i personaggi speciali sono stati assegnati al servlet, sono tutti incasinati. Ho risolto il problema utilizzando la seguente conversione:

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

aggiungo questo shell script per convertire i file jsp da 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

Ho usato il filtro di codifica che ha risolto il mio problema di codifica tutti ...

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

Grazie per tutti i suggerimenti. Usando Tomcat8 ho anche aggiunto un filtro come @Jasper de Vries ha scritto. Ma nei nuovi Tomcat al giorno d'oggi c'è un filtro già implementato che può essere usato e non commentato nel web Tomcat.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> 

E come tutti gli altri postati; Ho aggiunto URIEncoding="UTF-8" al connettore Tomcat in Apache. Anche questo ha aiutato.

importante da dire, che Eclipse (se si utilizza questo) ha una copia del suo web.xml e sovrascrive i Tomcat-Settings, come è stato spiegato qui: Broken UTF-8 URI Encoding in JSPs

Problemi correlati