编码问题。我哪里错了?

时间:2016-05-20 20:57:42

标签: c# php mysql json.net uwp

我试图从我的服务器传递数据并将其显示在UWP Windows应用程序中。数据存储在mySQL数据库中

enter image description here enter image description here

使用此代码

通过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.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);
            }

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

enter image description here

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

4 个答案:

答案 0 :(得分:5)

除了生成的json之外,你无法解决这个问题 - 因为它完全错误,这就是原因:

  • 团队名称中的特殊字符(Köln)在数据库中存储为UTF-8。 UTF-8中的ö0xc3 0xb6
  • 然后输出数据被编码(或者只是格式化)再次为UTF-16(在C#中称为Encoding.Unicode) 这是麻烦开始的地方。 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已解码)
  5. 由于json_encode需要一个UTF-8字符串,我怀疑问题发生在数据库和编码(php)之间。

    这篇文章可能会提示您编码设置可能不一致的地方:

    UTF-8-all-the-way-through

    如果您需要修改设置,您需要的输出是:

    "teamName": "1. FC K\u00f6ln""teamName": "1. FC Köln"(也应该没问题)

答案 1 :(得分:0)

而不是这个..

exe

..也许这个..?

$result = json_encode($data,JSON_PRETTY_PRINT);

..或两者..?

$result = json_encode($data,JSON_UNESCAPED_UNICODE);

答案 2 :(得分:0)

我相信您需要获取Unicode个字符的字节并将其转换为String

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

OR

new NotificationTeam
                    {
                        Title = Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(team.Value<string>("teamName"))),
                        TeamID = team.Value<int>("tid"),
                        Followers = team.Value<int>("followers")
                    })

答案 3 :(得分:0)

这可能是由于.NET Connector中的错误所致。在这种情况下,您应该指定

character_set_server=utf8mb4

在配置中或mysqld参数中的[--character-set-server=utf8mb4][1]