Appliquer le codage utf8 dans les appels de nœud à Java

Je passe un appel d’un nœud intermédiaire à un serveur Java et passe une chaîne en tant que paramètre de requête. Tout fonctionne à merveille jusqu’à ce que les caractères alphabétiques non anglais soient utilisés (ex: ř, ý). Lorsque Java reçoit ces caractères, il lance:

parse exception: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid UTF8! 

Cet appel fonctionne parfaitement:

 GET http://localhost:8000/server/name?name=smith 

Cet appel échoue avec l’erreur ci-dessus:

 GET http://localhost:8000/server/name?name=sořovský 

Ma question concerne les endroits où aborder ce problème. J’ai trouvé cet encodeur utf8 pour noeud et je pensais encoder mes chaînes en tant qu’utf8 avant d’appeler ma couche Java à l’avenir. Est-ce la bonne approche ou devrais-je faire quelque chose dans Java?

Remarque, voici à quoi ressemblent mes en-têtes de requête:

 { ... accept: 'application/json, text/plain, */*', 'accept-encoding': 'gzip, deflate, sdch', 'accept-language': 'en-US,en;q=0.8,el;q=0.6', ... } 

Enregistrez votre fichier javascript sur utf8.

 var name = "sořovský", param1 = encodeURIComponent(name); var url = "http://localhost:8000/server/name?name=" + param1; console.log(url); // http://localhost:8000/server/name?name=so%C5%99ovsk%C3%BD 

Vous pouvez voir le journal avec GET http://localhost:8000/server/name?name=sořovský :

 { "args": { "name": "sořovský" }, "headers": { "Accept": "application/json, text/plain, */*", "Accept-encoding": "gzip, deflate, sdch", "Accept-language": "en-US,en;q=0.8,el;q=0.6", //... }, "url": "http://localhost:8000/server/name?name=sořovský" } 

GET ne prend en charge que le jeu de caractères ASCII pour envoyer les autres caractères dont vous avez besoin pour encoder les caractères spéciaux.

Il est possible que le serveur n’utilise pas réellement utf-8 comme encodage par défaut (comme on pourrait normalement le supposer) mais utilise plutôt ISO-8859-1.

Ce qui, comme on peut s’y attendre, ne sera pas décodé avec utf-8 (cela ne sera évident que sur les caractères non-ASCII). J’ai eu un problème très similaire avec un serveur JBoss.

La solution pour moi était plutôt d’utiliser request.getParameter () (qui convertit automatiquement le paramètre en utilisant utf-8) pour utiliser à la place:

 Ssortingng name = new Ssortingng(request.getParameter("name").getBytes("iso-8859-1"),"utf-8"); 

On dirait que vous envoyez une chaîne UTF16 et que vous traitez comme UTF-8. Toutes les chaînes JavaScript sont en UTF16. Il se peut donc que les parameters soient également envoyés au format UTF16. Vous pouvez essayer d’envoyer les parameters via un encodeur UTF16 du côté de Java, puis les convertir en un encodage de votre choix.

Assurez-vous de vérifier également l’endianité de votre machine. J’espère que ça aide.