2012-06-07 15 views
5

Sto sviluppando una semplice applicazione web usando java/jsp/tomcat/mysql, e il maggior problema si trova nella codifica dei caratteri perché ho bisogno di gestire la codifica UTF-8 invece dell'8851 di defaultjava tomcat utf-8 problema di codifica

Prima di tutto vorrei descrivere la struttura del mio programma. Sto usando un servlet chiamato Controller.java per gestire tutte le richieste. Quindi in web.xml, ho un servlet Controller che accetta tutte le richieste da * .do.

Quindi questo controller invierà la richiesta in base all'URL richiesto, ad esempio, se il client richiede Register.do, il controllore invierà la richiesta a Register.java.

E nel Register.java, c'è un metodo che prende la richiesta come parametro, e cioè:

public String perform(HttpServletRequest request) { 
    do something with the request... 
} 

Quindi il problema è se voglio stampare qualcosa in UTF-8 all'interno di questo metodo, darà caratteri casuali. Ad esempio, ho un Enum che memorizza diverse costanti, una delle proprietà di Enum è il suo nome in cinese tradizionale. Se lo stampo in

public static void main(Stirng[] args{ 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

Questo è stampato correttamente in cinese. Tuttavia, se metto il codice esatto all'interno del metodo che fare con HttpServletRequest:

public String perform(HttpServletRequest request) { 
    System.out.println(MyEnum.One.getChn()); 
    logger.info(MyEnum.One.getChn()); 
} 

Sono stampati in caratteri casuali, ma posso vedere dalla finestra di debug (Eclipse) che le variabili sono in possesso di caratteri cinesi corretti.

Quindi, la stessa situazione si verifica quando voglio memorizzare il valore da request.getParameter(). Nella finestra di debug, posso vedere la variabile contiene caratteri corretti, ma uno stampo o cerco di memorizzarlo nel database, sono caratteri casuali.

Non so perché il comportamento si comporta in questo modo e questo mi impedisce di leggere i valori dei moduli inviati e di memorizzarli nel database. Qualcuno potrebbe dare qualche suggerimento su questo?

Grazie mille.

+1

Non riesco a capire se siete preoccupati di uscita corrotti su console e tronchi del server, * o * uscita corrotto nel risultante risposta al browser. Puoi chiarire? – erickson

+2

Qual è il valore di 'System.getProperty (" file.encoding ")'? – erickson

+0

Quello che mi preoccupa è che nella finestra di debug posso vedere la codifica corretta, ma quando passo la variabile al mio oggetto di accesso al database e la memorizzo nel db, diventeranno caratteri casuali. Quindi ho scoperto che nel metodo di gestione delle richieste, anche semplicemente stampare il valore di Enum UTF-8 non funziona. –

risposta

5

Se è necessario utilizzare la codifica UTF-8 (e in realtà, tutti dovrebbero essere in corso questo in questi giorni), allora si può seguire il "UTF-8 in tutto il mondo HOWTO" che si trova nella FAQ Tomcat:

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

Ricordare che è inoltre necessario supportare UTF-8 nei campi di testo del database.

ricordare inoltre che "la stampa" a volte una stringa con caratteri non ASCII in un file di log o nella console può essere influenzata da

  1. La codifica dei caratteri del flusso di uscita
  2. La codifica dei caratteri del lettore di file (ad esempio, cat/meno/vi)
  3. la codifica dei caratteri del terminale

Si potrebbe essere meglio scrivere i valori in un file e quindi utilizzando un edi esagonale per esaminare i contenuti per essere sicuri di ottenere i valori di byte che stai cercando.

+0

UTF-8 ovunque in Eclipse: [Unicode/UTF-8 nei progetti Java Eclipse] (http://stijndewitt.wordpress.com/2010/05/05/unicode-utf-8-in-eclipse-java/) –

8

Ecco un piccolo tutorial ciò che è necessario fare per rendere UTF-8 lavoro nell'applicazione Web:

Bisogna implementare filtro nella vostra applicazione per la codifica dei caratteri:

public class CharacterEncodingFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) 
      throws ServletException { 

    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
      throws IOException, ServletException { 
     servletRequest.setCharacterEncoding("UTF-8"); 
     servletResponse.setContentType("text/html; charset=UTF-8"); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 

    } 
} 

Hai per assicurarti che l'elemento connettore del file server.xml del tuo tomcat abbia l'attributo URIEncoding quale valore è UTF-8.

<Connector port="8080" 
      protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      URIEncoding="UTF-8" 
      redirectPort="8443"/> 

Inoltre è necessario specificare questo in ogni pagina JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
+1

In realtà, invece del filtro, penso che puoi inserire questo nei tuoi JSP: '<% @ page language =" java "contentType =" text/html; charset = UTF-8 "pageEncoding =" UTF-8 "%> ' –