UTF-16/UCS-2
Ez a szócikk nem tünteti fel a független forrásokat, amelyeket felhasználtak a készítése során. Emiatt nem tudjuk közvetlenül ellenőrizni, hogy a szócikkben szereplő állítások helytállóak-e. Segíts megbízható forrásokat találni az állításokhoz! Lásd még: A Wikipédia nem az első közlés helye. |
A számítástechnikában az UTF-16 változó hosszúságú (16 vagy 32 bites) karakterkódolási módszer. Képes kezelni a teljes Unicode Alap Többnyelvű Lapot (Basic Multilingual Plane - BMP) pontosan két byte-on, és minden más lapot pontosan négy byte-on. Az UCS-2 kötött hosszúságú (16 bites) részhalmaza az UTF-16-nak, de csak az alap többnyelvű lap kezelésére képes.
Az UTF-16-ot hivatalosan az ISO/IEC 10646-1 Q melléklete (Annex Q) határozza meg. A Unicode szabvány 3.0-s vagy magasabb változatai, illetve az IETF RFC 2781 is leírja az UTF-16-ot.
Az UTF-16 egyedülálló kódként jeleníti meg az Unicode vagy a ISO/IEC 10646 első 65536 kódpontját, amely megegyezik magával a kódpont értékével: 0 a 0-s kódpont esetében, hexadecimális FFFD az FFFD kódpont esetén.
Az első és a második lapok kezelési módszere
szerkesztésAz UTF-16 a hexadecimális FFFF-nél nagyobb kódértékek kezelését az úgynevezett helyettesítő pár módszerrel végzi, amikor is két 16 bites szóval ábrázolja a kódot, felhasználva ehhez a D800–DFFF közötti kódérték tartományt. Például, ha a kódtábla szerinti karakter értéke (kódpont) hexadecimális 10000, akkor ehhez a D800 DC00 sorozat tartozik, és ha a kódpont értéke hexadecimális 10FFFD, amely a Unicode felső korlátja is egyben, akkor az ehhez az értékhez tartozó kódponthoz a DBFF DFFD sorozat tartozik. A Unicode és az ISO/IEC 10646 a D800–DFFF tartományban lévő értékekhez semmilyen karakter kódértéket nem rendel, így a helyettesítő pár önálló értékei önmagukban semmilyen karakternek nem feleltethetők meg.
Nagy a végén/Kicsi a végén
szerkesztésEgy kódot tehát egy vagy két 16 bites szó reprezentál. Mivel ezeknek a szavaknak az endianitása a számítógép architektúráktól függően sokféle lehet, az UTF-16 meghatározott három kódolási sémát: UTF-16, UTF-16LE, és UTF-16BE.
Az UTF-16 kódolási séma előírja, hogy a byte-sorrendet jelezni kell egy úgynevezett byte-sorrend jelző (byte order mark, BOM) segítségével, amelynek meg kell előznie a tényleges szöveget. A BOM-ként használt karakter a „nulla szélességű nem törhető szóköz”, amely értelemszerűen sosem fordul elő eredeti jelentéstartalmával szöveg elején. Unicode száma hexadecimálisan FEFF; az FE FF byte-sorozat jelenti a „big-endian”, azaz „nagy végű”, és az FF FE sorozat jelenti a „little-endian”, azaz „kis végű” byte-sorrendet. UTF-16 és UCS-2 kódolású adat elején a jelző elkülöníthető magától a szövegtől, annak nem része, ez a dekódolás szempontjából előnyös.
Az UTF-16LE és az UTF-16BE kódolási séma lényegében megegyezik az UTF-16 kódolási sémájával, de nem használ BOM-ot, a byte-sorrend az eljárás nevéből következik (LE – little-endian, BE – big-endian). Az UTF-16LE vagy UTF-16BE kódolású szöveg elején előforduló BOM nem jelent BOM-ot, a szöveg részeként kell tekinteni. A gyakorlatban a legtöbb szoftver figyelmen kívül hagyja ezeket a felesleges BOM-okat.
Az IANA jóváhagyta az UTF-16, az UTF-16BE, és az UTF-16LE használatát az Interneten, pontosan ezekkel a nevekkel (nagybetűkkel). A szintén használt UTF_16 vagy UTF16 hordozhat jelentést bizonyos programozási nyelvekben vagy alkalmazásokban, de nem szabványos nevek az interneten.
Az UTF-16-ot használó legfontosabb operációs rendszerek
szerkesztésA szövegek belső ábrázolása UTF-16 kódolással történik a Microsoft Windows NT/2000/XP/CE, a Qualcomm BREW és a Symbian operációs rendszerekben, a Java és a .NET bytecode környezetében, a Mac OS X Cocoa és Core Foundation keretrendszerében és a Qt eszközrendszerben.
UCS-2
szerkesztésAz UCS-2 egy elavult specifikáció, amely csak a BMP kódolására alkalmas, és az UTF-16 tulajdonképpen kiváltotta. Néhány dokumentumban az UCS-2 és az UTF-16 kifejezések teljesen össze vannak keverve, és felcserélhetőnek látszanak; az UTF-16 gyakran szerepel az UCS-2 párjaként.
A Windows 2000 változatot megelőző NT operációs rendszerek csak az UCS-2-t támogatták.
Példák
szerkesztéskód érték | karakter | UTF-16 kód érték(ek) | glifa* |
---|---|---|---|
122 (hex 7A) | kis Z (Latin) | 007A | z |
27700 (hex 6C34) | víz (kínaiul) | 6C34 | 水 |
119070 (hex 1D11E) | zenei G kulcs | D834 DD1E | 𝄞 |
"水 z 𝄞" (víz, z, G kulcs), UTF-16 szerint kódolva | ||
---|---|---|
Kódolási forma | endianitás | Byte sorozat |
UTF-16LE | kicsi a végén | 34 6C, 7A 00, 34 D8 1E DD |
UTF-16BE | nagy a végén | 6C 34, 00 7A, D8 34 DD 1E |
UTF-16 | kicsi a végén, BOM-mal | FF FE, 34 6C, 7A 00, 34 D8 1E DD |
UTF-16 | nagy a végén, BOM-mal | FE FF, 6C 34, 00 7A, D8 34 DD 1E |
* Megfelelő fontok és szoftver szükséges a helyes jelek (glifák) megjelenítéséhez.
Példa a UTF-16 kódolási eljárásra
szerkesztésLegyen a kódolandó karakter értéke a (hexadecimális) U+64321, aminek az UTF-16 kódját kell előállítani. Mivel nagyobb, mint U+FFFF, ezért a helyettesítő párokat kell meghatározni, a következők szerint:
v = 0x64321 v′ = v – 0x10000 = 0x54321 = 0101 0100 0011 0010 0001
vh = 0101010000 // v′ felső 10 bitje vl = 1100100001 // v′ alsó 10 bitje w1 = 0xD800 // az eredmény 1. szavának feltöltése az alsó korláttal w2 = 0xDC00 // az eredmény 2. szavának feltöltése a felső korláttal
w1 = w1 | vh = 1101 1000 0000 0000 | 01 0101 0000 = 1101 1001 0101 0000 = 0xD950 // az eredmény 1. szava
w2 = w2 | vl = 1101 1100 0000 0000 | 11 0010 0001 = 1101 1111 0010 0001 = 0xDF21 // az eredmény 2. szava
A korrekt UTF-16 kódolás szerint a karaktert a következő szavak sorozata írja le:
0xD950 0xDF21
Mivel a karakter U+FFFF felett van, ezért UCS-2-ben nem kódolható.