2012-06-07 7 views
5

Ich bin eine einfache Web-Anwendung mit Java-Entwicklung/jsp/tomcat/mysql, und das Problem liegt auf der Zeichencodierung, weil ich mit UTF-8-Kodierung anstelle des Standard 8851 müssen befassen .java tomcat utf-8-Codierung Ausgabe

Zunächst ich meine Programmstruktur beschreiben möchten. Ich verwende ein Servlet namens Controller.java, um alle Anfragen zu bearbeiten. In web.xml habe ich ein Controller-Servlet, das alle Anfragen von * .do übernimmt.

Dann wird diese Steuerung die Anforderung auf der angeforderten URL versenden basiert, zum Beispiel, wenn der Client für register.do bittet, Controller, um die Anforderung an Register.java versenden.

Und im Register.java, gibt es ein Verfahren, das die Anforderung als Parameter übernimmt, nämlich:

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

Das Problem ist also, wenn ich etwas in UTF-8 innerhalb dieser Methode ausdrucken möchte, es wird zufällige Zeichen geben. Zum Beispiel habe ich eine Enum, die mehrere Konstanten speichert, eine der Eigenschaften der Enum hat ihren Namen in traditionellem Chinesisch. Wenn ich es in

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

drucken, wird dies korrekt in Chinesisch gedruckt. Wenn ich jedoch den genauen Code innerhalb der Methode mit HttpServletRequest Umgang setzen:

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

Sie werden als zufällige Zeichen gedruckt, aber ich kann aus den Debug-Fenstern (Eclipse) sehen, dass die Variablen richtig chinesische Schriftzeichen halten.

So ist nun mal die gleiche Situation, wenn ich den Wert von request.getParameter() gespeichert werden soll. Im Debug-Fenster kann ich sehen, dass die Variable korrekte Zeichen enthält, aber eins drucke ich aus oder versuche es in der Datenbank zu speichern, es sind zufällige Zeichen.

Ich weiß nicht, warum das Verhalten wie diese wirkt, und dies wird mich Wert aus der Lektüre eingereichten Form blockiert und sich in der Datenbank speichern. Könnte jemand dazu Hinweise geben?

Vielen Dank.

+1

Ich kann nicht verstehen, ob Sie über beschädigte Ausgabe auf dem Server der sich Sorgen Konsole und Protokolle, * oder * beschädigt Ausgang in der resultierende Antwort auf den Browser. Könntest Du das erläutern? – erickson

+2

Was ist der Wert von 'System.getProperty (" file.encoding ")'? – erickson

+0

Worüber ich mir Sorgen mache, ist, dass ich im Debug-Fenster die korrekte Kodierung sehen kann, aber wenn ich die Variable an mein Datenbank-Zugriffsobjekt übergebe und es in der Datenbank ablege, wird es zu zufälligen Zeichen. Also dann habe ich festgestellt, dass in der Methode der Umgang mit Anfragen, auch einfach ausdrucken UTF-8 Enum Wert funktioniert nicht. –

Antwort

5

Wenn Sie UTF-8-Codierung verwenden (und wirklich, jeder sollte dies in diesen Tagen gehen), dann können Sie die "UTF-8 überall HOWTO" im Tomcat FAQ gefunden folgen:

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

Denken Sie daran, dass Sie müssen auch UTF-8 in Ihrer Datenbank der Textfelder unterstützen.

Denken Sie auch daran, dass manchmal „Drucken“ einen String mit Nicht-ASCII-Zeichen in es in einer Protokolldatei oder der Konsole kann durch

  1. die Zeichenkodierung des Ausgangsstroms
  2. Die Zeichencodierung beeinflusst werden des Dateileser (zB cat/weniger/vi)
  3. die Zeichencodierung des Terminals

Sie könnten besser sein, die Werte in eine Datei zu schreiben und dann einen hex-edi mit Sie sollten den Inhalt überprüfen, um sicherzustellen, dass Sie die Byte-Werte erhalten, nach denen Sie suchen.

+0

UTF-8 überall in Eclipse: [Unicode/UTF-8 in Ihren Eclipse-Java-Projekten] (http://stijndewitt.wordpress.com/2010/05/05/unicode-utf-8-in-eclipse-java/) –

8

ist hier ein kleines Tutorial, was Sie tun müssen, um UTF-8-Arbeit in Ihrer Web-Anwendung machen:

Sie haben Filter in der Anwendung für die Zeichenkodierung implementieren:

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() { 

    } 
} 

Sie haben um sicherzustellen, dass das File-Connector-Element Ihres Tomcat-Servers.xml ein URIncoding-Attribut hat, dessen Wert UTF-8 ist.

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

Darüber hinaus müssen Sie diese in jeder JSP-Seite angeben:

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

Eigentlich, anstelle des Filters, denke ich, dass Sie dies in Ihre JSPs einfügen können: '<% @ page language =" java "contentType =" text/html; charset = UTF-8 "pageEncoding =" UTF-8 "%> ' –