gpt4 book ai didi

c# - 编码问题。我哪里错了?

转载 作者:可可西里 更新时间:2023-11-01 07:58:17 24 4
gpt4 key购买 nike

我正在尝试从我的服务器传递数据并将其显示在 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 字符?

最佳答案

除了生成的 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. 科隆(输入)
  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-all-the-way-through

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

"teamName": "1. FC K\u00f6ln""teamName": "1. FC Köln"(应该也可以)

关于c# - 编码问题。我哪里错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37355735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com