UTF-16 estas maniero prezenti unikodajn signonumerojn per sinsekvo da bajto-duopoj, foje nomataj vortoj. Ĝi estas difinita en la apendico Q de la normo ISO/IEC 10646 kaj priskribita en la RFC 2781 de IETF kaj en la unikoda normo ekde ĝia versio 3.0.

La nomo UTF-16 devenas de la anglalingva mallongigo por Unicode Transformation Format (unikoda transforma aranĝo). La nombro "16" indikas la fakton, ke la signonumerojn oni transformas en 16-bitajn vortojn, kutime reprezentatajn kiel bajto-paroj. Ĉiu unikoda signo (kodopunkto) estas prezentata per 1 aŭ 2 tiaj vortoj, do per 16 aŭ 32 bitoj.

Kodado de la signonumeroj redakti

​ En la kodado per UTF-16 necesas distingi inter la signonumeroj malpli grandaj ol 216 (< 65536, deksesume 0xFFFF) kaj la pli grandaj. La unua parto, nomata ankaŭ Baza Multlingva Tavolo (angle Basic Multilingual Plane, BMP) estas kodata per sia duuma valoro en 16 bitoj, aŭ du bajtoj. Por la pli grandaj signonumeroj necesas 32 bitoj (= 2 vortoj aŭ 4 bajtoj). ​ La du vortoj de la signoj en la dua grupo estas el la speciala "surogata" intervalo de 0xD800 al 0xDFFF, kiu ne estas uzata en BMP. La unua vorto estas inter 0xD800 kaj 0xDBFF, la dua inter 0xDC00 kaj 0xDFFF. Do ankaŭ tiuj du vortoj ne estas konfuzeblaj. Malgraŭ la fakto, ke la unua estas nombre malpli granda ol la dua, ili nomiĝas la "alta" kaj la "malalta" vortoj. La kodado okazas laŭ jenaj reguloj:

  • Subtrahu la nombron 0x10000 (la plej malgrandan valoron en tiu grupo) de la kodvaloro. La rezulto estas inter 0 kaj 0x0FFFFF, do 1-bitoj okazas nur inter la lastaj 20.
  • Prenu la unuajn dek el tiuj 20 bitoj; ili prezentas nombron inter 0 kaj 0x3FF. Adiciu ilin al la konstanta valoro 0xD800. La rezulto, inter 0xD800 kaj 0xDBFF, estas la unua, alta kodvorto.
  • Prenu la aliajn dek el tiuj 20 bitoj; ankaŭ ili prezentas nombron inter 0 kaj 0x3FF. Adiciu ilin al la konstanta valoro 0xDC00. La rezulto, inter 0xDC00 kaj 0xDFFFF, estas la dua, malalta kodvorto.

​ Sur la nivelo de la 16-bitaj vortoj do ĉiam estas klare, ĉu iu certa vorto estas

  • kodo de signo el BMP,
  • la alta parto de surogate kodita signo,
  • la malalta parto de surogate kodita signo.

Tio signifas ke eblas malkodi signovicon ne nur ekde ĝia komenco, sed ekde iu ajn loko. ​

Variaĵoj laŭ la bajta ordo redakti

​ Bedaŭrinde ekzistas diversaj manieroj ordigi la bajtojn interne de vorto. La pez-komenca ordo metas la pli signifajn bitojn komence, la pez-fina ordo metas ili fine. Ekzemple la numero 0x1234 estas pez-komence reprezentata kiel (0x12, 0x34), pez-fine kiel (0x34, 0x12). El tio rezultas tri malsamaj manieroj prezenti UTF-16-datumojn per bajtvicoj:

  • UTF-16BE ordigas la bajtojn de UTF-16-kodaĵo pezkomence.
  • UTF-16LE ordigas la bajtojn de UTF-16-kodaĵo pezfine.
  • UTF-16 (en strikta senco; vastasence ĉiuj tri metodoj nomiĝas UTF-16) ordigas la bajtojn de UTF-16-kodaĵo laŭ iu el tiuj maniero kaj komence de la kodaĵo aldonas bajt-ordan markilon (BOM). Ĝi estas la kodvorto 0xFEFF, kiu en pezkomenca ordo iĝas (0xFE, 0xFF) kaj en pezfina ordo (0xFF, 0xFE). Ĉar la signonumero 0xFFFE ne ekzistas en Unikodo, tuj du bajtoj klare identigas la bajtordon de la kodaĵo.

Uzo en la programlingvo Ĝavo redakti

La programlingvo Ĝavo (Java) dekomence uzas UTF-16 por kodi tekstojn (interne de programo). Kiam Ĝavo ekestis, Unikodo konsistis nur el BMP, do ne ekzistis 32-bitaj kodaĵoj. Ĉiu signo estis reprezentebla per 16 bitoj, kaj Ĝavo dependis de tio. Kiam Unikodo kreskis kaj necesis uzi signonumerojn kun pli ol 16 bitoj, Ĝavo devis distingi inter simplaj "signoj" (datumtipo char, 16 bitoj) kaj "kodopunktoj", prezentataj per 32-bitaj entjeroj (datumtipo int). La signoĉena datumtipo String nun distingas inter metodoj por trovi la n-an signon (charAt(n)) kaj la n-an kodopunkton (codePointAt(n)). ​ ​