UTF-16 , Unicode tarafından tanımlanan karakterlerin bir kodlamasıdır ; burada her bir karakter, 16 bitlik bir veya iki kelimelik bir dizide kodlanır .
Kodlama, Teknik Rapor 17'de Unicode standardında tanımlanmıştır. O zamandan beri, bu ek eski hale geldi çünkü UTF-16, onu çok sıkı bir şekilde tanımlayan Bölüm 3 Uyumluluğu'nda Unicode standardının ayrılmaz bir parçası .
UTF-16 , her karakterin iki bayt üzerindeki daha basit kodlaması olan UCS-2 ile karıştırılmamalıdır . Bununla birlikte, bu iki standardın her ikisi de Unicode olarak adlandırılır, çünkü kodlama, U + D800 ila U + DFFF (prensipte saklıdır) ve U + FFFF'den sonraki aralıklar (Occident'da az kullanılır) kullanılmadığı sürece aynıdır.
UTF-16, özellikle Windows ortamlarında kullanılır. Bu sistemde, sözde Unicode API'leri bu standardı kullanır. Aynısı NTFS sistemi için de geçerlidir .
UTF-16, UEFI tarafından kullanılan dize standardıdır .
Her karakterin numarası (bir kod noktası ), standart ISO / IEC 10646 tarafından verilir ve standart Unicode'da aynı şekilde çoğaltılır . Temsil edilebilecek kod noktaları, U + 0000 ila U + 10FFFF geçerlilik aralığında olmalı ve karakter olmayan bir karaktere atanmamalıdır. Unicode'daki tüm olası karakterler bu tür kod noktalarına sahiptir.
Herhangi bir kod noktası değeri, tek üzerine kodlanabilir olmayan bir karakteri olup kod noktasıyla iki bayt (16 bit ), yani herhangi bir kod noktası U +, 0000 U +, FFFD U + D7FF ve u + E000 için, olduğu tek bir 16-bit kelime üzerinde depolanır (bu nedenle U + D800 ila U + DFFF karakter olmayan aralığı hariç tutulur, yani en önemli 5 biti 11011 olan kod noktaları ).
Diğer durumlarda, karakter ek bir düzlemin kod noktasıdır (bu nedenle U + 10000 ile U + 10FFFD arasındadır ve 16 en önemsiz biti 0xFFFE veya 0xFFFF'ye eşit olmamalıdır); daha sonra , değerleri Unicode ve ISO / IEC 10646 standartlarının temel çok dilli düzleminde tahsis edilen indireksiyon yarım bölgelerinde ayrılan kod noktalarına karşılık gelen her biri 16 bitlik 2 ardışık kelimede ( kod noktaları ) depolanır :
Daha sonra, 16 bitlik kelimelerin sıralı bir bayt akışında depolanma biçimine bağlı olarak , son kodlama için iki sistem mümkündür:
Karakter numarası | 00000000 000uuuuu xxxxxxyy yyyyyyyy | |||
---|---|---|---|---|
UTF-16BE kodlaması (2 baytta) |
xxxxxxyy | yyyyyyyy | ||
(yalnızca uuuuu = 00000 ise ) | ||||
UTF-16BE kodlaması (4 baytta) |
110110ww | wwxxxxxx | 110111yy | yyyyyyyy |
ile wwww = uuuuu 1 - (eğer UUUUU > 00000 ) |
Karakter numarası | 00000000 000uuuuu xxxxxxyy yyyyyyyy | |||
---|---|---|---|---|
UTF-16LE kodlaması (2 baytta) |
yyyyyyyy | xxxxxxyy | ||
(yalnızca uuuuu = 00000 ise ) | ||||
UTF-16LE kodlaması (4 baytta) |
wwxxxxxx | 110110ww | yyyyyyyy | 110111yy |
ile wwww = uuuuu 1 - (eğer UUUUU > 00000 ) |
Kullanılan kodlama türünün belirtilmesi (baytların sırası), kullanılan protokol için örtük olabilir veya bu protokol tarafından açıkça belirtilebilir (örneğin, bir başlıkta "UTF-16BE" veya "UTF-16LE" ayrılmış adları gösterilerek) arasında MIME karakter seti ). Protokol baytların sırasını belirlemeye izin vermiyorsa ve alternatiflerden birine veya diğerine izin veriyorsa, verinin başında gösterge olarak geçerli U + FEFF kod noktasının UTF-16 kodlaması kullanılabilir. akış (çünkü akışı okurken baytlarının sırasındaki bir değişiklik, Unicode'da geçerli olan ancak bir karakter olmayana atanan ve bu nedenle bu durumda herhangi bir UTF-16 akışında yasak olan bir U + FFFE kod noktasına yol açacaktır. temsil edilir ( bayt sırası göstergesi , İngilizce bayt sırası işareti , kısaltılmış BOM ) yalnızca veri akışının başlangıcında kodlanır ve akışın nasıl kodlandığını bilmeye izin verir:
1 st bayt | 2 nd bayt | Etkili kodlama |
---|---|---|
0xFE | 0xFF | büyük endian |
0xFF | 0xFE | küçük endian |
Akışın başında her biri iki baytlık iki diziden biri mevcutsa, kodlama türü buradan çıkarılır ve dizi akıştan çıkarılır: bu veri akışında depolanan metnin herhangi bir karakterini temsil etmez. İki diziden hiçbiri veri akışının başında değilse, Unicode standardı, akışın kodunun big endian (UTF-16BE) ile çözülmesi gerektiğini belirtir .
Akışın başlangıcından farklı olarak (bir başlangıç ürün reçetesinden sonra dahil olmak üzere ), bu diziler bir BOM kodlama olarak tanınmaz ve kod çözme tek bir kodlama türü ile devam eder; öyleyse, bu diziler başlangıçtan sonra görünürse, o zaman:
Benzer şekilde, akış, 0xD800 ile 0xDBFF arasında 16 bitlik bir sözcük ve hemen ardından 0xDC00 ile 0xDFFF arasında bir sözcük içeriyorsa veya 0xDC00 ile 0xDFFF, 0xD800 ile 0xDBFF arasında bir sözcükle hemen öncesinde gelmez veya kod çözme, herhangi bir karakter olmayan başka bir kod noktasını gösteriyorsa.