Я пытаюсь передать данные с моего сервера и отобразить их в приложении 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);
}
вывод, когда отображается в моем приложении, выглядит так
какую часть потока необходимо изменить, чтобы правильно отображать символы Юникода?
Невозможно исправить это за пределами сгенерированного json — потому что это совершенно неправильно, и вот почему:
Köln
) храниться как UTF-8 в вашей базе данных.ö
в UTF-8 есть 0xc3
0xb6
,Encoding.Unicode
в C #)ö
в UTF-16 (и UTF-32) есть 0x00
0xf6
,\u00c3
а также \u00b6
вместо просто \u00f6
. Так что вместо один UTF-8 характер, вы в конечном итоге два utf-16 символы (которые представляют два байта одного и того же символа utf-8).\u
экранировать последовательности и превращать их (полностью прямо с его точки зрения) в два отдельных символа UTF-16 (ö
).Короче говоря, вот что происходит с вашими строками:
ö
в UTF-32 есть f6000000
ö
в UTF-16 есть f600
ö
в UTF-8 есть 3c
b6
Köln
(Вход)K[0xc3][0xb6]ln
(Sql UTF-8)K\u00c3\u00b6ln
(Json UTF-8 кодируется как UTF-16)Köln
(C # UTF-16 декодируется)поскольку json_encode ожидает строку UTF-8, я подозреваю, что проблема возникает где-то между базой данных и кодировкой (php).
Этот пост может дать вам подсказку, где параметры кодировки могут быть несовместимыми:
В случае, если вам нужно повозиться с вашими настройками, вам понадобится вывод:
"teamName": "1. FC K\u00f6ln"
или же "teamName": "1. FC Köln"
(должно быть тоже хорошо)
Вместо этого ..
$result = json_encode($data,JSON_PRETTY_PRINT);
.. Может быть, это .. ?
$result = json_encode($data,JSON_UNESCAPED_UNICODE);
.. или оба.. ?
$result = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
Я считаю, что вам нужно получить байты вашего 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")
})