UTF-8とUTF-16

ざっくりと
UTF-8は可変長マルチバイト文字であり、UTF-16は固定長マルチバイト文字
UTF-8は1 ~ 4Byteで文字を表現し、UTF-16は2Byteで文字を表現する。ただし2Byteで文字を表現しきれない場合はサロゲートペアといって2文字を組み合わせることで文字を表現する。つまり2Byte + 2Byte = 4Byteで文字を表現。

UTF-8はASCIIとの完全互換を持っている。
例えば'A'を表現するときはasciiで16進数で41
として認識されるので、UTF-8でも'41'として認識される。
しかしUTF-16の場合は0041
となる。これはUTF-16は固定長であり必ず16bitで表現しなければならないからである。

UTF-8はBOMが必要ない。なぜなら以下にあるように、prefixで次に何文字くるかがわかるようになっているからである。例えばBig indianの場合は、最初のバイトの頭から何bit1
が続いているかをみることで何文字続くか予想できる。逆にLittle Indianの場合は最初のbitが10
の場合は読み飛ばしていき、それ以外が来たときには何バイトで構成されているかを読み解けば、何バイトで一文字が構成されているか判断することができる

wikipediaのこの部分の説明がわかりやすい
1バイト目の先頭の連続するビット "1"(その後にビット "0" が1つ付く)の個数で、その文字のバイト数がわかるようになっている。また、2バイト目以降はビットパターン "10" で始まり、1バイト目と2バイト目以降では値の範囲が重ならないので、文字境界を確実に判定できる。すなわち、任意のバイトの先頭ビットが "0" の場合は1バイト文字、"10" の場合は2バイト以上の文字の2番目以降のバイト、"110" の場合は2バイト文字の先頭バイト、"1110" の場合は3バイト文字の先頭バイト、"11110" の場合は4バイト文字の先頭バイトであると判定できる。
7バイト以上の文字は規定されないため、0xFE, 0xFFは使用されない。このため、バイト順マーク (BOM) に0xFEと0xFFを使用するUTF-16やUTF-32が、UTF-8と混同されることはない。