конвертировать escape-последовательности Юникода в строку - PullRequest
1 голос
/ 09 декабря 2010

Привет, у меня есть эта проблема. С сервера я получаю строку JSON в качестве escape-последовательностей Юникода, и мне нужно преобразовать эти последовательности в строку Юникода. Я нахожу какое-то решение, но любое не работает для всех ответов json.

Например, с сервера я получаю эту строку.

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 в jsonstring состоит Nepru00edtomnu00fd , в Unicode-строке .net это Neprítomný .

область в jsonstring состоит из Banskobystricku00fd в строке .net unicode is it BanskoBystrický .

Другие примеры:

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

Мне нужно преобразовать escape-последовательности Юникода в строку .net на словацком языке.

При конвертации я использовал эту функцию:

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

Где может быть проблема?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Вот метод (основанный на предыдущих ответах), который я написал, чтобы сделать работу.Он обрабатывает как \ uhhhh, так и \ Uhhhhhhhh и сохраняет экранированные экранированные символы Юникода (поэтому, если ваша строка должна содержать литерал \ uffff, вы можете это сделать)Символ временного заполнителя \ uf00b находится в закрытой области использования , поэтому он не должен появляться в строках 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;
    }
1 голос
/ 09 декабря 2010

Ваши escape-последовательности не начинаются с \ like "\ u00fd", поэтому ваш Regex должен быть только

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

...

...