Pro un explication, vide illac.

/* Le . Converter un texto
   in interlingua del scriptura latin al scriptura armenie.

   Autor: Ruud Harmsen, https://rudhar.com/lingtics/intrlnga/scrptura/
  */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int conv_table[] =
{
   /* Base value: 0530 */
   /* Loosely based on Classical/Eastern Armenian pronunciation, see
      https://en.wikipedia.org/wiki/Armenian_alphabet */
   /* a */ 0x01,
   /* b */ 0x02,
   /* c */ 0x0e,
   /* d */ 0x04,
   /* e */ 0x05,
   /* f */ 0x26,
   /* g */ 0x03,
   /* h */ 0x10,
   /* i */ 0x0b,
   /* j */ 0x0a,
   /* k */ 0x0f,
   /* l */ 0x0c,
   /* m */ 0x14,
   /* n */ 0x16,
   /* o */ 0x18,
   /* p */ 0x1a,
   /* q */ 0x12,
   /* r */ 0x1c,
   /* s */ 0x1d,
   /* t */ 0x1f,
   /* u */ 0x25,
   /* v */ 0x1e,
   /* w */ 0x22,
   /* x */ 0x0d,
   /* y */ 0x15,
   /* z */ 0x06,
   /* safety stop */ -1,
};

static int convert (int c, FILE *fpi, FILE *fpo);
static int baseval = 0x0530;

int  main (int argc, char **argv)
{
   FILE *fpi = stdin, *fpo = stdout;
   int c;
   int intag = 0, inentity = 0;

   while ((c = getc(fpi)) != EOF)
   {
      if (!intag && c == '<')
         intag = 1;
      else if (intag && c == '>')
         intag = 0;
      else if (!inentity && c == '&')
         inentity = 1;
      else if (inentity && c == ';')
         inentity = 0;

      if (intag || inentity)
         putc(c, fpo);
      else
         convert(c, fpi, fpo);
   }

   return 0;
}

static int convert (int c, FILE *fpi, FILE *fpo)
{
   if (c == '.')
   {
      fprintf(fpo, "&#x%04x;", 0x0589);
   }
   else if (c == ',')
   {
      fprintf(fpo, "&#x%04x;", 0x055d);
   }
   else if (!isascii(c) || !isalpha(c))
   {
      putc(c, fpo);
   }
   else
   {
      int tabval, index, extra_for_lowercase = 0;

      if (isupper(c))
      {
         index = c - 'A';
      }
      else
      {
         index = c - 'a';
         extra_for_lowercase = 0x30;
      }

      /* Safety first */
      if (index >= 26)
          index = 26;

      tabval = conv_table[index];
      if (tabval < 0)
      {
         putc(c, fpo);
      }
      else
      {
         tabval += baseval + extra_for_lowercase;
         fprintf(fpo, "&#x%04x;", tabval);
      }
   }

   return 0;
}