首页 > 解决方案 > 通过 C# 将 Unicode 从 JSON 绑定到 XAML 不起作用。有办法吗?

问题描述

介绍

我想在移动应用程序中使用与在网站上相同的 Font Awesome 5 图标。

以下 XAML 片段完美地显示了该图标。

<!-- Events.xaml -->

<Label Text="&#xf51c;" FontFamily="{StaticResource FA-Solid}" />

我希望将从 JSON 接收到的数据绑定Text到此图标的值。

问题是我无法将 Font Awesome 代码转换为 C# 中的工作 Unicode,并且直接发送 Unicode 在 JSON 中的代码之前添加一个反斜杠。请注意,该字母č已正确转换为 JSON 中的 Unicode 等价物。但是如何将实际图标发送到 JSON 以将其转换为正确的 Unicode?

创建 JSON [PHP]

# api.php

$data = fetch_database_table_into_associative_array(); // Function made up for explanation
/*
[
  0 => [
    'title' => 'Tečaj',
    'icon' => 'f51c',
  ],
  1 => [ ... ],
  ...
]
*/

die(json_encode(['events' => $data]));
/*
{
   "events":[
      {
         "title":"Te\u010daj",
         "icon":"f51c"
      },
      {
         ...
      },
      ...
   ]
}
*/

接收和转换响应 [C#]

使用 异步获取数据HttpClient.GetAsync,将其读取为字符串并反序列化为我的对象效果很好。

Event

public class Event
{
  [JsonProperty("title")]
  public string Title { get; set; }

  [JsonProperty("icon")]
  public string Icon { get; set; }
}

并且所有事件的收集都List<Event> Events填充了数据。

尝试 1

<!-- Events.xaml -->

<Label Text="{Binding Icon}" FontFamily="{StaticResource FA-Solid}" />

这(显然)呈现 text f51c

尝试 2

<!-- Events.xaml -->

<Label Text="&#x{Binding Icon};" FontFamily="{StaticResource FA-Solid}" />

这无法绑定任何东西。

尝试 3

将属性 FormattedIcon 添加到模型事件并尝试

// Events.cs

foreach (var Event in Events)
{
  Event.FormattedIcon = "&#x" + Event.Icon + ";";
}
<!-- Events.xaml -->

<Label Text="{Binding FormattedIcon}" FontFamily="{StaticResource FA-Solid}" />

这会呈现 Unicode(我认为没有结尾;)而不是图标。

尝试 4

在阅读了 XAML 和SO上的代码隐藏&#x...;格式后,我从循环内部更改了语句(尝试 3)\u...foreach

// Events.cs

foreach (var Event in Events)
{
  Event.FormattedIcon = "\u" + Event.Icon;
}

这会导致错误并且无法编译。

尝试 5

与上面相同,但试图逃避反斜杠。

// Events.cs

foreach (var Event in Events)
{
  Event.FormattedIcon = "\\u" + Event.Icon;
}

再次呈现 Unicode(以不同于尝试 3 的格式)。

尝试 6 和 7

回到 PHP 中的 JSON 创建并替换'icon' => 'f51c''icon' => '\uf51c'as 'icon' => "\uf51c",并且在这两种情况下都json_encode将图标字符串转换为\\uf51cie。在字符串之前添加了反斜杠。

所以最后我尝试删除代码隐藏中的第一个反斜杠

// Events.cs

foreach (var Event in Events)
{
  Event.FormattedIcon = Event.Icon.Substring(1);
}

但它只是删除了转义的反斜杠并渲染uf51c

尝试 8

将 JSON 数据改回'icon' => 'f51c'. 改为string FormattedIconchar FormattedIcon模型中Event。试图将字符串读取为 Unicode 字符。

// Events.cs

foreach (var Event in Events)
{
  int characterCode = Convert.ToInt32(Event.Icon);
  Event.FormattedIcon = (char)characterCode;
}

转换错误

尝试 9

根据SOchar FormattedIconstring FormattedIcon模型中。Event

// Events.cs

foreach (var Event in Events)
{
  int characterCode = int.Parse(Event.Icon, System.Globalization.NumberStyles.HexNumber);
  Event.FormattedIcon = Char.ConvertFromUtf32(characterCode);
}

转换错误 ( System.FormatException: 'Input string was not in a correct format.')

帮助

对幸运数字 10 有什么建议吗?

标签: c#jsonxamlbindingfont-awesome

解决方案


推荐阅读