Как мне найти символ Unicode по его имени? - PullRequest
1 голос
/ 25 июня 2019

Это полная противоположность из этого вопроса.

В основном мне нужно что-то вроде:

char c = UnicodeInfo.FromName("EURO SIGN"); // c becomes €

Пакет UnicodeInfo NuGetв этом другом вопрос выглядит многообещающе, но, похоже, не обеспечивает эту функциональность.

Или я что-то упускаю?

РЕДАКТИРОВАТЬ:

Только для контекста: мне нужнопарсинг escape-последовательностей, таких как

"The price is \N{EURO SIGN} 20"

1 Ответ

1 голос
/ 01 июля 2019

Вы можете использовать библиотеку UnicodeInformation , о которой вы упомянули, для достижения этой цели. Он дает вам всю необходимую информацию, поэтому вы можете создать свой собственный вспомогательный класс для обратного сопоставления.

Вот пример класса:

public static class UnicodeName
{
   private static Dictionary<string, string> nameDisplayTextDictionary = 
      UnicodeInfo.GetBlocks().SelectMany((block) => block.CodePointRange).Select(codePoint => UnicodeInfo.GetCharInfo(codePoint)) // select all character infos
      .Where(charInfo => charInfo.Name != null) // filter out the ones that have null names
      .ToDictionary(charinfo => charinfo.Name, charInfo => charInfo.GetDisplayText()); // create lookup dictionary to get the display text from the name

   public static string GetDisplayText(string unicodeName)
   {
      if (nameDisplayTextDictionary.ContainsKey(unicodeName))
      {
         return nameDisplayTextDictionary[unicodeName];
      }
      else
      {
         throw new Exception($"Unknown unicode name {unicodeName}");
      }
   }
}

Вы можете использовать его так, как хотите.

string displayText = UnicodeName.GetDisplayText("EURO SIGN");

Метод возвращает строку, поскольку в некоторых случаях возвращаемое значение не является одним символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...