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. |
| Unicode |
|---|
|
UCS |
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]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]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]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]Az 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és]| 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]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árt kell meghatározni, a következők szerint:
v = 0x64321
v′ = v – 0x10000
= 0x54321
= 0101 0100 0011 0010 0001
vh = (v'>>10)&0x03FF = 0101010000 = v′ felső 10 bitje
vl = v'&0x03FF = 1100100001 = v′ alsó 10 bitje
w1 = 0xD800 | vh
= 1101 1000 0000 0000 |
01 0101 0000
= 1101 1001 0101 0000
= 0xD950 // az eredmény 1. szava
w2 = 0xDC00 | 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