UTF-8 is by far the most used way to encode characters in electronic communication. It's purpose is to turn the numbers that the Unicode standard gives each character and put them in computer memory in such a way that they are easily readable, compact, and unambiguous.
Since the largest number possible in Unicode is 1,112,063 and its binary representation is 100001111011111111111(21 digits), one would think that having every 21 bits(bite is one binary digit) in memory represent one character is a good idea. However, there are 2 problems here.
Firstly, it seems inefficient to use all 21 bits for all the characters, since the vast majority of all characters used are in the first 1/20th or so of the list. If this were to be used, almost everything would start with a ton of leading zeros, wasting precious memory.
The second problem is that computers, for computer reasons that we will not get into, "like" having their memory in "bytes" of 8, so a potential encoding where 2 characters can share a byte isn't ideal.
The way UTF-8 solves both of these is by having a variable length encoding, where each character starts with information on how many bytes it has("0" for 1, "110" for 2, "1110" for 3, and "11110" for 4), and each byte after that has a prefix("10") which states that it is a continuation of a character already started.
In the table above, this is illustrated by x's being the actual character, while the numbers written down are just there to tell the computer what is what and where characters begin. (Example)
Another handy thing is that for the first 128 characters, the encoding is the exact same as the ASCII encoding, so any text written in ASCII can be interpreted by UTF-8.