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