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.

 
hex \ so bytes print nicely
 
[
  "\u0041", 
  "\u00F6",
  "\u0416",
  "\u20AC"
] 
\ add the 0x1D11E one; the '\u' string notation requires four hex digits
  "" 1D11E s:+ a:push
 
\ for each test, print it out and its bytes:
(
  dup . space
  b:new 
  ( . space drop ) b:each 
  cr
) a:each! drop
 
cr
\ now the inverse:
[
  [41],
  [C3,B6],
  [D0,96],
  [E2,82,AC],
  [$F0,9D,84,9E]
]
 
(
  dup . space
  b:new >s  .  cr
) a:each! drop
 
bye
 