2011-11-16 13 views
14

ho istruire il mio URL per inviare una richiesta Ajax così:UTF-8 URL Decode/Encode

url += '/' + something + '/' + id; 
var response; 
$.ajax({ 
    async : false, 
    type: 'DELETE', 
    url: url, 
... 

mio removeId è una variabile che include caratteri UTF-8. Io gestirà quella variabile al lato Java così:

@RequestMapping(value = "/something/{id}", method = RequestMethod.DELETE) 
    public void myMethod(HttpServletResponse response, @PathVariable String id) { 
    ... 

Tuttavia id variabile al lato Java è diverso dal suo originale, perché UTF-8 caratteri modifiche alle cose strane.

Come posso inviare caratteri UTF-8 dal lato JavaScript e trasformarlo di nuovo sul lato Java (Spring 3 con REST, il mio server Web è Tomcat 7)?

PS 1: Anche io non uso encodeUriComponent sembra che il mio URL stia codificando da solo?

PS 2: Per rendere questione più chiara:

i.e. my id variable is araç and sent URL is: localhost:8080/sdfasf/ara%C3%A7 

quando vedo che variabile id ha quel valore:

araç 

invece di:

ara%C3%A7 

fa Spring (o Tomcat) lo fanno automaticamente? C'è un modo per decodificarlo automaticamente quando si tratta di controllo come una variabile percorso (intendo senza scrivere nulla come come:

URLDecoder.decode(id,"UTF-8"); 

sarà convertito automaticamente)

risposta

16

Il valore di identificazione visualizzato sembra essere decodificato utilizzando il set di caratteri iso-8859-1 anziché utf-8. La codifica della parte del percorso di un url non è specificata in Java EE e non esiste alcuna API standard per impostarla.Per i parametri di query è possibile utilizzare request.setCharacterEncoding prima di accedere a qualsiasi parametro per averli decodificati correttamente. Lo CharacterEncodingFilter fa esattamente questo, ma non ha alcuna influenza sui parametri del percorso.

Per fare in modo che questo funzioni in Tomcat, è necessario impostare l'attributo URIEncoding dell'elemento Connector nel suo server.xml su "utf-8".

Tutto ciò che avreste sempre voluto sapere sulla codifica dei caratteri in una webapp java può essere trovato in this excellent answer a una domanda simile.

+1

grazie per la tua risposta e la votazione. Voglio solo sicuro. Io uso Spring e ho fatto quella configurazione (non ho fatto nulla con Tomcat) e penso di aver risolto il mio problema. Mi manca qualcosa (voglio dire forse non ho risolto esattamente il problema e alcuni caratteri daranno un errore?) E c'è qualche esempio su come usare request.setCharacterEncoding? – kamaci

+0

@kamaci: non mi ero reso conto che era la tua risposta e che ha già risolto il tuo problema quando ho postato la mia risposta. Chiamare 'setCharacterEncoding' non ha funzionato per i parametri del percorso con il contenitore OC4j di Oracle, forse con tomcat. Anche se questo contraddice alcune risposte a domande simili come http://stackoverflow.com/questions/8079152/charset-filter-causing-issue-in-parsing-utf-8-characters/8079547#8079547 o http://stackoverflow.com/questions/2630748/how-to-enable-reading-non-ascii-characters-in-servlet/2630977 # 2630977 –

+0

grazie per la tua risposta dettagliata. – kamaci

1

Hai provato impostando la codifica pagina su la pagina in cui stai incorporando il javascript?

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

Assicurarsi che la codifica della pagina è impostato su UTF-8 con l'aggiunta di questo diritto sotto la partenza <head> tag:

<meta charset="utf-8"> 

anche assicurarsi che il file JavaScript viene salvato con codifica UTF-8. Controlla le impostazioni dell'editor di testo.

+0

ho quella linea al mio HTML e la mia Editor salva la mia pagina come UTF-8. Penso che si tratti di un invio di una variabile UTF-8 tramite URL? – kamaci

+0

@kamaci Cosa significa 'console.log (url); 'dire? –

+0

La mia variabile id è 'araç' e l'URL è: http: // localhost: 8080/sdfasf/ara% C3% A7 – kamaci

0

In JavaScript usare:

data=encodeURIComponent(data); 

per codificare i dati, e in Java si può fare:

data=java.net.URLDecoder.decode(data); 
+0

Nella domanda l'ID fa parte del percorso della richiesta, quindi viene decodificato dal contenitore del servlet. Inoltre, il metodo 'decode' dovrebbe essere chiamato con il secondo parametro che specifica il set di caratteri da usare. –

3

ho trovato la risposta qui: http://forum.springsource.org/showthread.php?14063-How-to-set-setCharacterEncoding-on-Request

ho fatto che la configurazione al mio Lato primavera:

<filter> 
    <filter-name>SetCharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>SetCharacterEncodingFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

e funziona perfettamente con UTF-8.

-1

Non è necessario codificare la stringa sul lato javascript. Java non supporta Unicode in modo decodifica deve essere fatto lì come:

output = new String(input.getBytes("ISO-8859-1"), "UTF-8");