4 votes

Chaîne JSONP avec des caractères non-ASCII brouillés

J'ai un petit service web en C# 4.0 qui renvoie des données via JSONP. Le problème que j'ai est que les caractères non-ASCII - comme les umlauts allemands (ä, ö, ü) - sont brouillés lorsqu'ils arrivent chez le client. Le code simplifié suivant illustre ceci :

// L'interface
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string GetTestString();

//...

// L'implémentation
public string GetTestString()
{
    return "Chaîne avec quelques caractères allemands : äöüß";
}

Maintenant, si j'accède à la méthode web via Firefox en entrant l'URL http://localhost:31843/TestWebService/GetTestString, j'obtiens le résultat correct :

"Chaîne avec quelques caractères allemands : äöüß"

Cependant, si je spécifie le paramètre callback dans l'URL (http://localhost:31843/TestWebService/GetTestString?callback=Test), ce que fait JSONP, j'obtiens un résultat brouillé :

Test("Chaîne avec quelques caractères allemands : äöüß");

Le sérialiseur JSONP est celui du framework Microsoft .NET 4.0 que j'ai activé en définissant webHttpBinding.CrossDomainScriptAccessEnabled = true; dans mon code. Je n'ai trouvé aucun moyen d'influencer l'encodage de caractères de ce sérialiseur. Avez-vous des idées ?

Autre indication : Après la requête web pour la chaîne JSONP avec les caractères brouillés, Firebug affiche l'erreur suivante dans la console :

"L'encodage de caractères du document texte brut n'a pas été déclaré. Le document s'affichera avec un texte brouillé dans certaines configurations de navigateur si le document contient des caractères en dehors de la plage US-ASCII. L'encodage de caractères du fichier doit être déclaré dans le protocole de transfert ou le fichier doit utiliser un marqueur d'ordre de bits comme signature d'encodage."

Apparemment, c'est le problème. Mais la question est, comment configurer le bon encodage (et pourquoi n'est-ce pas UTF-8 par défaut) ?

Mise à jour :

Je pense que le DataContractJsonSerializer de Microsoft .NET a un bug. Dans le premier cas avec JSON, il envoie l'en-tête HTTP suivant :

Content-Type: application/json; charset=utf-8

Lors de l'utilisation de JSONP en spécifiant le paramètre d'URL callback, il envoie :

Content-Type: application/x-javascript

Aucun encodage de caractères n'est donc spécifié, laissant la décision de l'ensemble de caractères au navigateur. Après quelques recherches sur Internet, je suis convaincu qu'il n'y a pas de moyen (facile) de forcer le DataContractJsonSerializer à envoyer un en-tête HTTP Content-Type avec un jeu de caractères approprié.

3voto

Tobias Points 348

J'ai maintenant trouvé une solution assez simple à ce problème - peut-être un peu artificielle.

Explication : Je développe une application pour smartphones avec un framework JavaScript, donc ce n'est pas une application native mais qui s'exécute dans le moteur de navigation du smartphone. Pour cette raison, tout le contenu web (fichiers HTML, JavaScript, CSS, etc.) est chargé localement, pas à distance depuis un serveur web. C'est pourquoi il n'y a pas d'en-tête HTTP Content-Type approprié avec un jeu de caractères, car il n'y a pas de HTTP du tout. Dans le fichier index.html, qui est la page principale (la seule) de l'application, aucun jeu de caractères n'était spécifié. Donc le navigateur a assumé un jeu de caractères par défaut, malheureusement pas UTF-8.

La solution simple pour moi a donc été de spécifier le jeu de caractères dans le index.html en ajoutant la ligne suivante :

De cette façon, même les données JSONP intégrées s'affichent correctement, sans nécessiter que le jeu de caractères de la réponse HTTP JSONP soit spécifié explicitement.

Bien sûr, cela ne résout pas l'affichage incorrect dans Firefox, comme indiqué dans ma question ci-dessus. Mais cela n'a pas d'importance, car cela doit simplement s'afficher correctement dans le navigateur du smartphone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X