2010-12-09 43 views
1

Bonjour, j'ai ce problème. A partir du serveur, j'obtiens une chaîne JSON comme séquences d'échappement Unicode et j'ai besoin de convertir cette séquence en chaîne Unicode. Je trouve une solution, mais aucune ne fonctionne pour toute réponse json.convertir des séquences d'échappement unicode en chaîne

Par exemple du serveur je reçois cette chaîne.

string encodedText="{\"DATA\":{\"idUser\":18167521,\"nick\":\"KecMessanger2\",\"photo\":\"1\",\"sex\":1,\"photoAlbums\":0,\"videoAlbums\":0,\"sefNick\":\"kecmessanger2\",\"profilPercent\":0,\"emphasis\":false,\"age\":25,\"isBlocked\":false,\"PHOTO\":{\"normal\":\"http://213.215.107.125/fotky/1816/75/n_18167521.jpg?v=1\",\"medium\":\"http://213.215.107.125/fotky/1816/75/m_18167521.jpg?v=1\",\"24x24\":\"http://213.215.107.125/fotky/1816/75/s_18167521.jpg?v=1\"},\"PLUS\":{\"active\":false,\"activeTo\":\"0000-00-00\"},\"LOCATION\":{\"idRegion\":\"1\",\"regionName\":\"Banskobystricku00fd kraj\",\"idCity\":\"109\",\"cityName\":\"Rimavsku00e1 Sobota\"},\"STATUS\":{\"isLoged\":true,\"isChating\":false,\"idChat\":0,\"roomName\":\"\",\"lastLogin\":1291898043},\"PROJECT_STATUS\":{\"photoAlbums\":0,\"photoAlbumsFavs\":0,\"videoAlbums\":0,\"videoAlbumsFavs\":0,\"videoAlbumsExts\":0,\"blogPosts\":0,\"emailNew\":0,\"postaNew\":0,\"clubInvitations\":0,\"dashboardItems\":26},\"STATUS_MESSAGE\":{\"statusMessage\":\"Nepru00edtomnu00fd.\",\"addTime\":\"1291887539\"},\"isFriend\":false,\"isIamFriend\":false}}"; 

StatusMessage dans jsonstring se composent Nepru00edtomnu00fd, dans .net chaîne unicode est-il Neprítomný.

région

dans jsonstring se composent Banskobystricku00fd dans .net chaîne unicode est-il Banskobystrický.

Autres exemples:

  1. Nepru00edtomnu00fd -> Neprítomný
  2. Banskobystricku00fd -> Banskobystrický
  3. Trenu010du00edn -> Trenčín

J'ai besoin de convertir des séquences d'échappement unicode à chaîne .net dans langue slovaque.

sur la conversion J'ai utilisé cette func:

private static string UnicodeStringToNET(string input) 
{ 
    var regex = new Regex(@"\\[uU]([0-9A-F]{4})", RegexOptions.IgnoreCase); 
    return input = regex.Replace(input, match => ((char)int.Parse(match.Groups[1].Value, 
     NumberStyles.HexNumber)).ToString()); 
} 

Où peut-être un problème?

+0

Je vous recommande fortement de remplacer votre adresse IP actuelle dans la chaîne JSON par une adresse bidon pour obtenir de l'aide. –

+0

Ceci est bloqué, réparer le serveur. –

+0

Oui, si vous remplacez chaque séquence de 'u' suivi de quatre chiffres hexadécimaux, vous allez bousiller des mots valides. Si les barres obliques inverses ont disparu, le contenu d'origine est irrécupérable. Vous devez savoir où ces barres obliques inversées sont supprimées et arrêter cela. (Un scanner d'injection anti-SQL mal orienté est devenu fou?) – bobince

Répondre

1

Vos séquences d'échappement ne démarre pas avec un \ comme « \ u00fd » de sorte que vous Regex devrait être seulement

"[uU]([0-9A-F]{4})" 

...

2

est ici une méthode (en fonction des réponses précédentes) que j'ai écrit faire le travail. Il gère à la fois \ uhhhh et \ Uhhhhhhhh, et il préservera les échappements unicode échappés (donc si votre chaîne doit contenir un \ uffff littéral, vous pouvez le faire). Le caractère d'espace réservé temporaire \ u0027b est dans un private use area, il ne devrait donc pas se produire généralement dans les chaînes Unicode.

public static string ParseUnicodeEscapes(string escapedString) 
    { 
     const string literalBackslashPlaceholder = "\uf00b"; 
     const string unicodeEscapeRegexString = @"(?:\\u([0-9a-fA-F]{4}))|(?:\\U([0-9a-fA-F]{8}))"; 
     // Replace escaped backslashes with something else so we don't 
     // accidentally expand escaped unicode escapes. 
     string workingString = escapedString.Replace("\\\\", literalBackslashPlaceholder); 

     // Replace unicode escapes with actual unicode characters. 
     workingString = new Regex(unicodeEscapeRegexString).Replace(workingString, 
      match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)) 
      .ToString(CultureInfo.InvariantCulture)); 

     // Replace the escaped backslash placeholders with non-escaped literal backslashes. 
     workingString = workingString.Replace(literalBackslashPlaceholder, "\\"); 
     return workingString; 
    } 
+0

Je ne pense pas que ce soit correct pour les caractères au-dessus de 0xFFFF. Casting un Int32 à un char tronquerait la valeur. –