As described in UTF-8 and in Wikipedia, UTF-8 is a popular encoding of (multi-byte) Unicode code-points into eight-bit octets.

The goal of this task is to write a encoder that takes a unicode code-point (an integer representing a unicode character) and returns a sequence of 1-4 bytes representing that character in the UTF-8 encoding.

Then you have to write the corresponding decoder that takes a sequence of 1-4 UTF-8 encoded bytes and return the corresponding unicode character.

Demonstrate the functionality of your encoder and decoder on the following five characters:

Character   Name                                  Unicode    UTF-8 encoding (hex)
---------------------------------------------------------------------------------
A           LATIN CAPITAL LETTER A                U+0041     41
ö           LATIN SMALL LETTER O WITH DIAERESIS   U+00F6     C3 B6
Ж           CYRILLIC CAPITAL LETTER ZHE           U+0416     D0 96
€           EURO SIGN                             U+20AC     E2 82 AC
𝄞           MUSICAL SYMBOL G CLEF                 U+1D11E    F0 9D 84 9E

Provided below is a reference implementation in Common Lisp.

 
Module EncodeDecodeUTF8 {
      a$=string$("Hello" as UTF8enc)
      Print Len(A$)=2.5   ' 2.5 words=5 bytes
      b$=string$(a$ as UTF8dec)
      Print b$
      Print Len(b$)=5 ' 5 words = 10 bytes   
 
      Print Len(string$("A" as UTF8enc))=.5  ' 1 byte
      Print Len(string$("ö" as UTF8enc))=1   ' 2 bytes
      Print Len(string$("Ж" as UTF8enc))=1   ' 2 bytes
      Print Len(string$("€" as UTF8enc))=1.5   ' 3 bytes
      Print Len(string$("𝄞" as UTF8enc))=2      '4 bytes
      a$=string$("𝄞" as UTF8enc)
      Buffer Bytes as Byte*4
      Return Bytes, 0:=a$
      \\ F0 9D 84 9E
      Hex Eval(bytes, 0), Eval(bytes, 1), Eval(bytes, 2), Eval(bytes, 3) 
}
EncodeDecodeUTF8
 