UTF-16, 16-bit Unicode Transformation Format, is een tekencodering met een variabele lengte, die de gehele Unicode-tekenset ondersteunt.
De codeerstandaard zet karakters om vanuit een Unicode-codepoint naar een reeks van 16-bitwoorden. Karakters uit het Basic Multilingual Plane (BMP) kunnen worden omgezet naar één woord van 16 bits. De karakters daarboven worden omgezet in twee woorden (een zogenoemd surrogaatpaar).
Alle codepoints van U+0000 tot en met U+10FFFF (behalve de oneigenlijke codepoints U+D800–U+DFFF en codepoints voor toekomstig gebruik) kunnen worden omgezet naar UTF-16.
Omdat veel computers rekenen in eenheden van bytes, zijn er drie gerelateerde encoding-schema's: UTF-16, UTF-16BE en UTF-16LE. Ze verschillen alleen in de byte order (bytevolgorde) om een 16-bit-eenheid voor te stellen. Alle schema's resulteren in óf een 2- óf een 4-bytereeks voor een karakter.
UTF-16 is officieel gedefinieerd in bijlage Q van de internationale standaard ISO/IEC 10646-1. Het staat ook beschreven in de Unicode-standaard, versie 3.0 en hoger, alsmede in RFC 2781 van IETF.
UCS-2 (2-byte Universal Character Set) is een incourante manier om karakters te coderen. UCS-2 is een voorloper van UTF-16. De UCS-2-standaard is bijna identiek aan UTF-16, behalve dat het geen surrogaatparen ondersteunt en daarom alleen de karakters in het BMP-bereik (van U+0000 t/m U+FFFF) kan coderen.
De consequentie van deze vaste-lengtecodering is dat elk karakter een 16-bitwaarde voorstelt. UTF-16 kent drie gerelateerde codeerschema's (UCS-2, UCS-2BE, UCS-2LE) die alle karakters kunnen opleveren in een specifieke bytevolgorde.
Vanwege de technische verwantschap en opwaartse compatibiliteit van UCS-2 naar UTF-16 worden de twee standaarden vaak foutief door elkaar gehaald en uitwisselbaar genoemd. Dat wil zeggen, er wordt gezegd dat tekenreeksen die zijn gecodeerd in UTF-16 soms foutief als UCS-2 worden herkend.
Voor zowel UTF-16 als UCS-2 geldt dat alle 65.536 codepoints in BMP (vlak 0), met uitzondering van de 2048 speciale tekens, overeenkomen met dezelfde gecodeerde waardes. Dus codepoint U+0000 is gecodeerd als nummer 0 en U+FFFF is gecodeerd als 65.535 (dat is FFFF16 in hexadecimaal).