2010-12-09 6 views
1

Hallo, ich habe dieses Problem. Vom Server bekomme ich JSON-String als Unicode-Escape-Sequenzen und ich muss diese Sequenzen in Unicode-String konvertieren. Ich finde eine Lösung, aber jede funktioniert nicht für alle JSON-Antwort.konvertieren Unicode-Escape-Sequenzen in String

Zum Beispiel vom Server bekomme ich diese Zeichenfolge.

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}}"; 

status in jsonstring bestehen Nepru00edtomnu00fd, in .net Unicode-String ist es Neprítomný.

Region in jsonstring bestehen Banskobystricku00fd in NET-Unicode-Zeichenfolge ist es Banskobystricky.

Weitere Beispiele:

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

Ich brauche Unicode-Escape-Sequenzen .net Zeichenfolge konvertieren in Slowakische Sprache.

Auf Umwandlung ich diese func verwendet:

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()); 
} 

Wo Problem sein kann?

+0

Ich würde sehr empfehlen, ersetzen Sie Ihre tatsächliche IP-Adresse in der JSON-Zeichenfolge mit einem falschen für den Zweck, Hilfe zu bekommen. –

+0

Dies ist korrumpiert, den Server reparieren. –

+0

Ja, wenn Sie jede Sequenz von "u" gefolgt von vier Hex-Ziffern ersetzen, werden Sie gültige Wörter vermasseln. Wenn Backslashes fehlen, kann der ursprüngliche Inhalt nicht wiederhergestellt werden. Sie müssen herausfinden, wo diese Backslashes entfernt werden, und damit aufhören. (Fehlgeleitet Anti-SQL-Injektionsscanner verrückt geworden?) – bobince

Antwort

1

Ihre Escape-Sequenzen mit einem \ wie "\ u00fd" so dass Sie nicht starten Regex sollte nur

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

...

2

Hier ist eine Methode (basierend auf früheren Antworten), die ich schrieb den Job erledigen. Es handhabt sowohl \ uhhhh als auch \ Uhhhhhhhh, und es behält entgangene Unicode-Escapes bei (wenn Ihre Zeichenfolge also ein Literal \ uffff enthalten muss, können Sie das tun). Das temporäre Platzhalterzeichen \ uf00b befindet sich in private use area, daher sollte es in Unicode-Zeichenfolgen normalerweise nicht auftreten.

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

Ich glaube nicht, dass dies für Zeichen über 0xFFFF korrekt ist. Wenn Int32 in ein Zeichen umgewandelt wird, wird der Wert abgeschnitten. –