C# 编码问题。我哪里做错了?

C# 编码问题。我哪里做错了?,c#,php,mysql,json.net,uwp,C#,Php,Mysql,Json.net,Uwp,我正在尝试从我的服务器传递数据,并将其显示在UWP Windows应用程序中。数据存储在mySQL数据库中 这是通过PHP输出到一个网页在这里使用此代码 // Serialize the data structure $result = json_encode($data,JSON_PRETTY_PRINT); // Display the XML document header('Content-type: application/json; chars

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

这是通过PHP输出到一个网页在这里使用此代码

// 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);
            }
JArray obj=JsonConvert.DeserializeObject(str.Trim())作为JArray; if(obj==null | | obj.Count==0)返回; foreach(通知团队nt从obj中的JObject团队输入 选择 新通知小组 { 标题=团队价值(“团队名称”), TeamID=团队价值(“tid”), 追随者=团队价值(“追随者”) }) { Notifications=ScoreManager.GetMgr().GetTeamNotification(nt.TeamID); 通知团队。添加(nt); } 在我的应用程序中显示的输出如下

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

而不是此

$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
字符的字节,并将其转换为
字符串

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

新通知团队
{
Title=Encoding.ASCII.GetString(Encoding.Unicode.GetBytes(team.Value(“teamName”)),
TeamID=团队价值(“tid”),
追随者=团队价值(“追随者”)
})

除了生成的json之外,您无法修复此问题,因为它完全错误,原因如下:

  • 团队名称中的特殊字符(
    Köln
    )将作为UTF-8存储在数据库中。 UTF-8中的
    ö
    0xc3
    0xb6
  • 然而,输出数据随后被再次编码(或格式化)为UTF-16(也称为C#中的
    Encoding.Unicode
    ) 麻烦就从这里开始0x00
0xf6
  • UTF-8字符字节被编码为两个独立的UTF-16字符
    \u00c3
    \u00b6
    ,而不仅仅是
    \u00f6
    。因此,不再使用一个utf-8字符,而是使用两个utf-16字符(表示相同utf-8字符的两个字节)
  • 您的应用程序可以识别转义序列并将其(从其角度完全正确)转换为两个单独的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解码)
  • 由于需要UTF-8字符串,我怀疑问题发生在数据库和编码(php)之间的某个地方

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

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


    “teamName”:“1.FC K\u00f6ln”
    “teamName”:“1.FC Köln”
    (也可以)

    这可能是由于.NET连接器中的错误造成的。在这种情况下,您应该指定

    character_set_server=utf8mb4
    

    在mysqld参数的config或
    [--character set server=utf8mb4][1]
    中,您是否尝试了
    Encoding.ASCII.GetString(yourBytes)
    您建议我在哪里使用它?我的web响应返回为字符串
    StreamReader requestReader=newstreamreader(response.GetResponseStream());字符串webResponse=requestReader.ReadToEnd()
    你能在有问题的文本中而不是图片中发布你的实际Unicode字符吗?在数据库中它是1。FC Kèln C#输出为“1.FC Kèln”,可以在上面的链接中看到json输出。在插入MysqlI之前,您需要使用设置名称utf8更改服务器连接。它更改了html输出,但对应用程序输出没有任何影响。好吧,我不能再提出任何建议,因为我没有在C中执行任何操作。执行C后,我会得到输出“1\0。\0\0F\0C\0\0K\0?\0?\0l\0n\0”,显示为1。应用程序中的FC K??ln您的期望值是多少?尝试使用创建您的问题;使用系统执行下面的代码
    ;使用系统文本;公共类程序{public static void Main()。它是哪种语言?
    
    character_set_server=utf8mb4