UTF-16/UCS-2

A Wikipédiából, a szabad enciklopédiából

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és | forrásszöveg szerkesztése]

Az 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és | forrásszöveg szerkesztése]

Egy 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és | forrásszöveg szerkesztése]

A 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és | forrásszöveg szerkesztése]

Az UCS-2 egy elavult specifikáció, amely csak a BMP kódolására alkalmas, és az UTF-16 tulajdonképen 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és | forrásszöveg szerkesztése]

kó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és | forrásszöveg szerkesztése]

Legyen 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 karakteret a következő szavak sorozata írja le:

0xD950 0xDF21

Mivel a karakter U+FFFF felett van, ezért UCS-2-ben nem kódolható.

Lásd még[szerkesztés | forrásszöveg szerkesztése]

Egyéb, angol nyelvű linkek[szerkesztés | forrásszöveg szerkesztése]