web-dev-qa-db-fra.com

Décodage/codage d'URL UTF-8

Je demande à mon URL d'envoyer une requête Ajax comme celle-ci:

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

Ma removeId est une variable qui inclut le caractère UTF-8. Je vais gérer cette variable du côté Java comme ça:

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

Cependant, la variable id du côté de Java est différente de celle d'origine car les caractères UTF-8 deviennent des éléments étranges.

Comment puis-je envoyer des caractères UTF-8 à partir de JavaScript et les transformer à nouveau de mon 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 soit codée par elle-même?

PS 2: Pour clarifier la question:

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 

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

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

il sera converti automatiquement)

14
kamaci

La valeur id que vous voyez semble être décodée en utilisant le jeu de caractères iso-8859-1 au lieu de utf-8. Le codage de la partie chemin d'une 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 à des paramètres pour les décoder correctement. La 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 sur "utf-8".

Vous trouverez tout ce que vous avez toujours voulu savoir sur le codage de caractères dans une application Web Java dans cette excellente réponse à une question similaire.

16
Jörn Horstmann

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

J'ai fait cette configuration à mon côté de printemps:

<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 cela fonctionne très bien pour UTF-8.

3
kamaci

Avez-vous essayé de définir le codage de page sur la page où vous intégrez le javascript?

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

Assurez-vous que le codage de page est défini sur UTF-8 en ajoutant ce droit sous la balise <head> de départ:

<meta charset="utf-8">

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

1
Mathias Bynens

En utilisation JavaScript:

data=encodeURIComponent(data);

pour encoder des données, et en Java vous pouvez faire:

data=Java.net.URLDecoder.decode(data);
0
Akhil Thayyil