преобразование u0040 в @ В C#


API Facebook graph возвращает мне адрес электронной почты пользователя как

foou0040bar.com.

В объекте JSON. Мне нужно преобразовать его в

foo@bar.com.

В .NET должен быть встроенный метод, который изменяет символьное выражение Unicode (u1234) на фактический символ unicode.

Вы знаете, что это такое?

Примечание: Я предпочитаю не использовать JSON.NET или JavaScriptSerializer для проблем производительности.

Я думаю, что проблема в моем StreamReader:

        requestUrl = "https://graph.facebook.com/me?access_token=" + accessToken;
        request = WebRequest.Create(requestUrl) as HttpWebRequest;
        try
        {
            using (HttpWebResponse response2 = request.GetResponse() as HttpWebResponse)
            {
                // Get the response stream  
                reader = new StreamReader(response2.GetResponseStream(),System.Text.Encoding.UTF8);
                string json = reader.ReadToEnd();

Я пробовал разные кодировки для StreamReader, UTF8, UTF7, Unicode, ... ничего не помогало.

Большое спасибо!

Спасибо Л. Б. за то, что поправил меня. Проблема была не в StreamReader.
2 4

2 ответа:

Ответы Json не являются двоичными данными, которые можно преобразовать в строку с помощью некоторых кодировок. Вместо этого они являются строками, правильно декодированными вашим браузером или HttpWebResponse, как в вашем примере. Для получения окончательных данных требуется повторная обработка(регулярное выражение, десериализаторы и т. д.).

Смотрите, что вы получаете с webClient.DownloadString("https://graph.facebook.com/HavelVaclav?access_token=????") без какой-либо кодировки

{"id":"100000042150992",
    "name":"Havel V\u00e1clav",
    "first_name":"Havel",
    "last_name":"V\u00e1clav",
    "link":"http:\/\/www.facebook.com\/havel.vaclav",
    "username":"havel.vaclav",
    "gender":"male",
    "locale":"cs_CZ"
}

Изменится ли ваша кодировка \/ на /?

Итак, проблема не в вашем StreamReader.

Да, есть какой-то встроенный метод для этого, но это будет включать что-то вроде использования компилятора для разбора строки как кода...

Используйте простую замену:

s = s.Replace(@"\u0040", "@");

Для более гибкого решения можно использовать регулярное выражение, которое может обрабатывать любой символ Юникода:

s = Regex.Replace(s, @"\\u([\dA-Fa-f]{4})", v => ((char)Convert.ToInt32(v.Groups[1].Value, 16)).ToString());