2010-05-29 6 views
3

J'ai une question très simple que je n'arrive pas à comprendre. J'ai une UTF8-String correctement codée que j'analyse en un JObject avec Json.NET, bidouille avec quelques valeurs et l'écris à la ligne de commande, gardant les caractères encodés intacts.Sortie C# UTF8 garder les caractères encodés intacts

Tout fonctionne très bien sauf pour garder les caractères codés intacts.

code:

var json = "{roster: [[\"Tulg\u00f4r\", 990, 1055]]}"; 
var j = JObject.Parse(json); 
for (int i = 0; i < j["roster"].Count(); i++) 
{ 
    j["roster"][i][1] = ((int)j["roster"][i][1]) * 3; 
    j["roster"][i][2] = ((int)j["roster"][i][2]) * 3; 
} 
Console.WriteLine(JsonConvert.SerializeObject(j, Formatting.None)); 

sortie réelle:

{"roster":[["Tulgôr",2970,3165]]} 

sortie souhaitée:

{"roster":[["Tulg\u00f4r",2970,3165]]} 

Il semble que mon phrasé dans Google est inappropriée car rien utile est venu. Je suis sûr que c'est quelque chose d'ultra-facile et je me sentirai très bête après. :)

Répondre

3

Prenez la sortie de JsonConvert.SerializeObject et exécutez-la via une méthode d'assistance qui convertit tous les caractères non-ASCII en leur équivalent "\ uHHH". Un exemple de mise en œuvre est donné ci-dessous.

// Replaces non-ASCII with escape sequences; 
// i.e., converts "Tulgôr" to "Tulg\u00f4r". 
private static string EscapeUnicode(string input) 
{ 
    StringBuilder sb = new StringBuilder(input.Length); 
    foreach (char ch in input) 
    { 
     if (ch <= 0x7f) 
      sb.Append(ch); 
     else 
      sb.AppendFormat(CultureInfo.InvariantCulture, "\\u{0:x4}", (int) ch); 
    } 
    return sb.ToString(); 
} 

Vous appelleriez comme suit:

Console.WriteLine(EscapeUnicode(JsonConvert.SerializeObject(j, Formatting.None))); 

(Notez que je ne gère pas les caractères non-BMP spécialement, parce que je ne sais pas si votre application tierce veut « \ U00010000 "ou" \ uD800 \ uDC00 "(ou quelque chose d'autre!) Lors de la représentation U + 10000.)

1

Je ne suis pas sûr de voir le problème ici. La sortie réelle contient le caractère Unicode, il est interprété correctement après avoir été spécifié en utilisant la syntaxe \ u. Il contient le caractère correct, donc contient les "octets" corrects. Bien sûr, ce sera une chaîne .Net donc Unicode, plutôt que UTF-8.

+0

À droite, mais je ne veux pas que le caractère soit interprété dans la sortie. Je veux voir la représentation unicode sur la ligne de commande, donc je peux copier-coller la chaîne résultante dans une application tierce qui nécessite le \ u, car elle ne semble pas correctement analyser l'entrée autrement. –

+0

Ok, il semble que votre application tierce attend ASCII ou UTF-8. Lorsque vous copiez et collez, vous copiez et collez UTF-16. Ce que vous voulez, c'est un code d'échappement ASCII codé Unicode. @ La réponse de Bradley devrait faire l'affaire. –

Questions connexes