преобразование 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 ответа:
Ответы 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());