编码问题.我哪里错了?

Rea*_*rld 3 php c# mysql json.net uwp

我正在尝试从我的服务器传递数据并将其显示在UWP Windows应用程序中.数据存储在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;
Run Code Online (Sandbox Code Playgroud)

然后我在我的应用程序中使用HttpWebRequest读取它,然后使用JSON.net反序列化JSON

            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);
            }
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中显示的输出是这样的

在此输入图像描述

需要更改流的哪一部分才能正确显示unicode字符?

Man*_*mer 5

除了生成的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-83c 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"(也应该没问题)