C # — проблема кодирования. Куда я иду не так?

Я пытаюсь передать данные с моего сервера и отобразить их в приложении Windows UWP. Данные хранятся в базе данных MySQL

введите описание изображения здесь
введите описание изображения здесь

Это выводится через PHP на веб-страницу здесь http://www.rwscripts.com/scorealerts/v3/request.php?action=getTeams используя этот код

// Serialize the data structure
$result = json_encode($data,JSON_PRETTY_PRINT);
// Display the XML document
header('Content-type: application/json; charset=utf-8');

print $result;

Затем я читаю это в моем приложении с HttpWebRequest, а затем десериализую JSON с JSON.net

            JArray obj = JsonConvert.DeserializeObject(str.Trim()) as JArray;
if (obj == null || obj.Count == 0) return;

foreach (NotificationTeam nt in from JObject team in obj
select
new NotificationTeam
{
Title = team.Value<string>("teamName"),
TeamID = team.Value<int>("tid"),
Followers = team.Value<int>("followers")
})
{
nt.Notifications = ScoreManager.GetMgr().GetTeamNotification(nt.TeamID);

notificationTeams.Add(nt);
}

вывод, когда отображается в моем приложении, выглядит так

введите описание изображения здесь

какую часть потока необходимо изменить, чтобы правильно отображать символы Юникода?

3

Решение

Невозможно исправить это за пределами сгенерированного json — потому что это совершенно неправильно, и вот почему:

  • Специальные символы в названиях команд (Köln) храниться как UTF-8 в вашей базе данных.
    ö в UTF-8 есть 0xc3 0xb6,
  • Выходные данные затем кодируются (или просто форматируются) снова как UTF-16 (он же Encoding.Unicode в C #)
    Здесь начинается проблема. ö в UTF-16 (и UTF-32) есть 0x00 0xf6,
  • Байты символов UTF-8 кодируются как два отдельный Символы UTF-16 \u00c3 а также \u00b6 вместо просто \u00f6. Так что вместо один UTF-8 характер, вы в конечном итоге два utf-16 символы (которые представляют два байта одного и того же символа utf-8).
  • Ваше приложение распознает \u экранировать последовательности и превращать их (полностью прямо с его точки зрения) в два отдельных символа UTF-16 (ö).

Короче говоря, вот что происходит с вашими строками:

ö в UTF-32 есть f6000000
ö в UTF-16 есть f600
ö в UTF-8 есть 3c b6

  1. Köln (Вход)
  2. K[0xc3][0xb6]ln (Sql UTF-8)
  3. K\u00c3\u00b6ln (Json UTF-8 кодируется как UTF-16)
  4. Köln (C # UTF-16 декодируется)

поскольку json_encode ожидает строку UTF-8, я подозреваю, что проблема возникает где-то между базой данных и кодировкой (php).

Этот пост может дать вам подсказку, где параметры кодировки могут быть несовместимыми:

UTF-8-все—полосная сквозной

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

"teamName": "1. FC K\u00f6ln" или же "teamName": "1. FC Köln" (должно быть тоже хорошо)

5

Другие решения

Вместо этого ..

$result = json_encode($data,JSON_PRETTY_PRINT);

.. Может быть, это .. ?

$result = json_encode($data,JSON_UNESCAPED_UNICODE);

.. или оба.. ?

$result = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
0

Я считаю, что вам нужно получить байты вашего Unicode символы и скрыть его String,

var bytes = Encoding.Unicode.GetBytes(NotificationTeam.Title);
NotificationTeam.Title = Encoding.ASCII.GetString(bytes);

ИЛИ ЖЕ

new NotificationTeam
{
Title = Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(team.Value<string>("teamName"))),
TeamID = team.Value<int>("tid"),
Followers = team.Value<int>("followers")
})
0
По вопросам рекламы [email protected]