2010-06-02 3 views
13

Possiedo un'applicazione web demo che crea utenti. Quando provo a inserire dati in altre lingue (come in francese) i caratteri non sono codificati correttamente. Il codice del controller è:Problema di codifica utilizzando Spring MVC

@SuppressWarnings("unchecked") 
    @RequestMapping(value = "/user/create.htm", params={"id"}, method = RequestMethod.GET) 
    public String edit(@RequestParam("id") Long id, ModelMap model) { 
     System.out.println("id is " + id); 
     User user = userService.get(id); 

     model.put("user", user); 
     return "user/create"; 
    } 

    @RequestMapping(value = "/user/create.htm", method = RequestMethod.POST) 
    public String save(@ModelAttribute("user") User user, BindingResult result) { 

     System.out.println(user.getFirstName()); 
     System.out.println(user.getLastName()); 


     validator.validate(user, result); 
     if(result.hasErrors()) { 
      return "user/create"; 
     } 

     userService.save(user); 
     return "redirect:list.htm"; 
    } 

mio web.xml è:

... 

    <filter> 
     <filter-name>encoding-filter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</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>encoding-filter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

... 

e la pagina è:

<%@ page language="java" contentType="text/html; charset=UTF-8" 
    pageEncoding="UTF-8"%> 
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

... 

<form:form method="post" commandName="user"> 

... 

<form:input path="firstName" cssErrorClass="form-error-field"/> 

... 

quando entro alcuni personaggi francesi nel primo nome poi l'output da system.out.println è ????+????? o qualcosa di simile.

Ho visto altre persone che lo sistemavano con lo CharacterEncodingFilter ma questo non sembra funzionare.

Grazie mille.

Modificato il valore del filtro.

+0

sì hai ragione, stavo testando varie cose e ho dimenticato di modificarlo di nuovo. Il problema è lo stesso anche se –

risposta

2

Forse mi manca qualcosa, ma se la codifica della pagina nel tuo JSP è "UTF-8", la codifica nel tuo CharacterEncodingFilter non dovrebbe essere UTF-8 piuttosto che ISO-8859-7?

0

L'output di System.out.println() dipende dalla codifica della console, quindi non è un buon modo per eseguire il debug dei problemi di codifica.

Per verificare che i valori siano decodificati correttamente, è necessario visualizzarlo su un'altra pagina. In realtà, è già stato eseguito in caso di errore di convalida del modulo, quindi il sistema funziona correttamente se i valori nei campi rimangono gli stessi dopo l'errore di convalida.

7

Se questo ancora non funziona e si utilizza Tomcat come server applicazioni tenta di impostare la seguente opzione su ogni elemento <Connector> nel server.xml:

<Connector URIEncoding="UTF-8" ...> 
    ... 
</Connector> 

Questo ha fatto il trucco per me. Potrebbero esserci opzioni simili per altri server delle applicazioni, quindi potresti voler controllare la documentazione del server.

+0

Questo ha risolto lo stesso problema per me – Kerb

11

Provare a rendere CharacterEncodingFilter il primo filtro in web.xml.

Mi rendo conto che questa domanda è un po 'vecchia, ma mi sono imbattuto nello stesso problema e lo spostamento di CharacterEncodingFilter lo ha risolto per me.

1

È necessario aggiungere accept-charset = "UTF-8" al modulo.

+0

Questo ha fatto il trucco per me. Grazie! – Robin

0

Ci sono due cose per aiutare:

  1. Nel file setenv.sh aggiungere JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
  2. nello script che avvia il processo di Tomcat, impostare l'ambiente LANG: export LANG='utf-8'

Questo può quindi essere testato esaminando il set di caratteri predefinito: Charset.defaultCharset().