Moin,
ein Zeichensatz beschreibt die äußere Form, also wie etwas dargestellt wird (optisch). Unicode ansich definiert die Bedeutung eines bestimmten Wertes in der Unicode-Tabelle, also wofür dieser dort in der natürlichen Sprache steht. Die UTF-Geschichten dienen der Transformation der "Unicode-Daten". So bildet UTF-8 diese Codepoints aus der Unicode-Tabelle auf einen Octett-Stream ab. Dieser hat wiederum eine bestimmte Bedeutung, die bei der Interpretation zu beachten ist.
Unicode im allgemeinen Gebrauch ist auf ~1 Mio Zeichen begrenzt. Diese Restriktion hat auch was mit den ganzen Transformationen zu tun, um ein gewisses Maß an Integration zu gewährleisten (UTF-8, UTF-16). Neben UTF wird dir auch noch UCS ins Auge gesprungen sein, das liegt an den zwei Instanzen, die sich für Unicode-Definitionen zuständig fühlen.
Bei Windows-Systemen triffst du häufig auf UTF-16, Bei Unix-Systemen auf UTF-32/UTF-8, und im Internet häufig auf UTF-8. Der Grund hierfür sind die bereitgestellten APIs der unterschiedlichen Systeme. UTF-8 eignet sich besonders für die Übermittlung von Unicode-Daten, da man hier nicht auf eine mögliche Byte-Order achten muss.
Ab Visual Studio 2013 wird übrigens auf Multibyte-Strings verzichtet, dass ist eine spezielle Form von Kodierung auf Windows-Systemen.