C# 编码问题。我哪里做错了?
我正在尝试从我的服务器传递数据,并将其显示在UWP Windows应用程序中。数据存储在mySQL数据库中 这是通过PHP输出到一个网页在这里使用此代码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
// 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
\u00c3
和\u00b6
,而不仅仅是\u00f6
。因此,不再使用一个utf-8字符,而是使用两个utf-16字符(表示相同utf-8字符的两个字节)Ã
)ö
为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解码)“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