Расшифровка кириллицы c HTML сущностей в C# - PullRequest
3 голосов
/ 21 февраля 2020

У меня есть string, взятый с веб-сайта с использованием HtmlAgilityPack, который содержит HTML сущностей кириллицы c букв

Пример:

"Корпус"

Есть ли способ сохранить его в символы в C# при сохранении в файл? Я пытался использовать HttpUtility.HtmlDecode и WebUtility.HtmlDecode из System.Web, но не помогло .

Моя попытка:

using System;
using System.Web;

namespace esp
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            body = "Корпус";

            //output will be "Корпус"
            Console.WriteLine(HttpUtility.HtmlDecode(body)); 
        }
    }
}

1 Ответ

2 голосов
/ 21 февраля 2020

Просто догадываюсь . Насколько я вижу, у нас есть следующий формат:

  &
   Letter(s) - transliterated letter 
   cy        - stands for Cyrillic 
  ; 

Мы можем сопоставить все буквы с помощью Регулярные выражения и Concat их в string например

  using System.Text.RegularExpressions;

  ...

  string body = "Корпус";

  var transliteratedText = Regex.Replace(
         body, 
       @"&(?<letter>[A-Za-z]+)cy;",
         m => m.Groups["letter"].Value);

  Console.Write(transliteratedText);

И у нас будет

Korpus

, что звучит разумно, поскольку оно транслитерировано Русское слово Корпус (Corpus, Body, Bulk, Carcass). Существует несколько стандартов транслитерации (я пробовал Библиотека Конгресса схема, которая является лишь одной из самых популярных); Чтобы определить правильный стандарт (или создать наш собственный), мы хотим больше данных.

Редактировать Например, если у нас есть схема, скажем,

private static Dictionary<string, string> translit = 
  new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) {
  {"a", "а"},
  {"b", "б"},
  {"v", "в"},
  {"g", "г"},
  {"d", "д"},
  {"ie", "е"},
  //{"", "ё"}, //TODO: define the letter transliteration
  {"zh", "ж"},
  {"z", "з"},
  {"i", "и"},
  {"j", "й"},
  {"k", "к"},
  {"l", "л"},
  {"m", "м"},
  {"n", "н"},
  {"o", "о"},
  {"p", "п"},
  {"r", "р"},
  {"s", "с"},
  {"t", "т"},
  {"u", "у"},
  {"f", "ф"},
  {"h", "х"},
  {"ts", "ц"},
  {"ch", "ч"},
  {"sh", "ш"},
  {"shch", "щ"},
  //{"", "ъ"}, //TODO: define the letter transliteration
  {"y", "ы"},
  //{"", "ь"}, //TODO: define the letter transliteration
  //{"", "э"}, //TODO: define the letter transliteration
  //{"", "ю"}, //TODO: define the letter transliteration
  {"ya", "я"},
};

, мы можем транслитерировать каждую букву:

private static string MyDecoding(string value) {
  return Regex
    .Replace(value, @"&(?<letter>[A-Za-z]+)cy;", m => {
      string v = m.Groups["letter"].Value;

      return char.IsUpper(v[0])
        ? CultureInfo.InvariantCulture.TextInfo.ToTitleCase(translit[v])
        : translit[v];
      }
    );
}
...

Console.Write(MyDecoding("&Kcy;&ocy;&rcy;&pcy;&ucy;&scy;"));

Итог:

Корпус
...