2011-11-16 5 views
14

J'instruisent mon URL d'envoyer une requête Ajax comme ça:URL UTF-8 Decode/Encode

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

Mon removeId est une variable qui comprend un caractère UTF-8. Je poignée variable à côté Java comme ça:

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

Cependant la variable id à côté Java est différent de son origine, car caractères UTF-8 changements à des choses étranges.

Comment puis-je envoyer des caractères UTF-8 du côté JavaScript et les transformer de nouveau côté Java (Spring 3 avec REST, mon serveur web est Tomcat 7)?

PS 1: Même si je n'utilise pas encodeUriComponent, il semble que mon URL est encodée par elle-même?

PS 2: Pour rendre la question plus claire:

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

Quand je vois cette variable id a cette valeur:

araç 

au lieu de:

ara%C3%A7 

Est-ce Spring (ou Tomcat) le fait automatiquement? Est-il possible de le décoder automatiquement quand il s'agit de contrôleur comme une variable de chemin (je veux dire sans écrire quoi que ce soit comme:

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

il sera converti automatiquement)

Répondre

16

La valeur d'identifiant que vous voyez semble être décodée en utilisant le jeu de caractères iso-8859-1 au lieu de utf-8. L'encodage de la partie chemin d'un URL n'est pas spécifié dans Java EE et il n'y a pas d'API standard pour le définir.Pour les paramètres de requête, vous pouvez utiliser request.setCharacterEncoding avant d'accéder aux paramètres pour les décoder correctement. Le CharacterEncodingFilter fait exactement cela mais n'a aucune influence sur les paramètres de chemin.

Pour que cela fonctionne dans Tomcat, vous devez définir l'attribut URIEncoding de l'élément Connector dans son server.xml à "utf-8".

Tout ce que vous avez toujours voulu savoir sur l'encodage de caractères dans une webapp java se trouve dans this excellent answer à une question similaire.

+1

merci pour votre réponse et voter jusqu'à. Je veux juste être sûr. J'utilise Spring et fait cette configuration (n'a rien fait avec Tomcat) et je pense que j'ai résolu mon problème. Est-ce que je manque quelque chose (je veux dire peut-être que je n'ai pas résolu le problème exactement et certains caractères donneront aussi une erreur?) Et y a-t-il un exemple d'utilisation de request.setCharacterEncoding? – kamaci

+0

@kamaci: Je n'avais pas réalisé que c'était ta réponse et qu'elle avait déjà résolu ton problème quand j'ai posté ma réponse. L'appel 'setCharacterEncoding' n'a pas fonctionné pour les paramètres de chemin avec le conteneur OC4j d'Oracle, peut-être avec tomcat. Bien que cela contredit certaines réponses à des questions similaires, comme http://stackoverflow.com/questions/8079152/charset-filter-causing-issue-in-parsing-utf-8-characters/8079547#8079547 ou http://stackoverflow.com/questions/2630748/comment-activer-lire-non-caractères-ascii-dans-servlets/2630977 # 2630977 –

+0

merci pour votre réponse détaillée. – kamaci

1

Avez-vous essayé de placer la page de codage sur la page où vous embarquez le javascript?

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

Assurez-vous que le codage de la page est en UTF-8 en ajoutant ce droit en dessous du démarrage <head> tag:

<meta charset="utf-8"> 

Assurez-vous également que le fichier JavaScript est enregistré avec l'encodage UTF-8. Vérifiez les paramètres de l'éditeur de texte.

+0

J'ai cette ligne à mon HTML et mon éditeur enregistre ma page au format UTF-8. Je pense que c'est un problème d'envoyer une variable UTF-8 sur URL? – kamaci

+0

@kamaci Que dit 'console.log (url);' –

+0

Ma variable id est 'araç' et l'URL est: http: // localhost: 8080/sdfasf/ara% C3% A7 – kamaci

0

En JavaScript utiliser:

data=encodeURIComponent(data); 

pour le codage des données, et en Java que vous pouvez faire:

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

Dans la question, l'ID fait partie du chemin de la requête, de sorte qu'il est déjà décodé par le conteneur de servlets. En outre, la méthode 'decode' devrait être appelée avec le second paramètre spécifiant le jeu de caractères à utiliser. –

3

J'ai trouvé la réponse ici: http://forum.springsource.org/showthread.php?14063-How-to-set-setCharacterEncoding-on-Request

je l'ai fait cette configuration à mon Côté côté:

<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> 

et il fonctionne très bien pour UTF-8.

-1

Pas besoin d'encoder la chaîne du côté javascript. Java ne supporte pas unicode si le décodage doit être fait là aussi:

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