UTF-8(7) | Linux Programmer's Manual | UTF-8(7) |
UTF-8 - ASCII kompatíbilis több bájtos Unicode kódolás
Az Unicode karakterkészlet 16 bites kódteret foglal el. A legkézenfekvőbb Unicode kódolás (az UCS-2) 16 bites szavak sorozatából áll. Az ilyen karakterláncok olyan bájtokat is tartalmazhatnak egyes 16 bites karakterek részeként, mint a '\0' vagy a '/', amelyeknek speciális jelentésük van fájlnevekben és különféle C könyvtári függvények paramétereiben. Ráadásul a UNIX-os segédprogramok többsége ASCII fájlokat vár, és nem tudja a 16 bites szavakat karakterként feldolgozni jelentős módosítások nélkül. Ezért az UCS-2 nem megfelelő az Unicode kódolására fájlnevekben, szövegfájlokban, környezeti változókban, stb. Az ISO 10646 Universal Character Set (UCS), amely tartalmazza részhalmazként az Unicode-ot, már 31 bites kódtéren helyezkedik el, és a kézenfekvő UCS-4 kódolás (32 bites szavak sorozata) erre a karakterkészletre ugyanezeket a problémákat veti fel.
Az Unicode és az UCS UTF-8 típusú kódolása mentes ezektől a problémáktól, ezért ez a követendő út a Unicode karakterkészlet használatára a Unix-szerű operációs rendszerek alatt.
Az UTF-8 kódolás a következő jó tulajdonságokkal rendelkezik:
A következő bájtsorozatok reprezentálnak egy karaktert. A használandó sorozat függ a karakter UCS kódjától.
Az xxx bitpozíciókat azokkal a bitekkel kell feltölteni, amelyek a karakter kódját alkotják kettes számrendszerbeli reprezentációban. Csak a legrövidebb több bájtos reprezentációt szabad használni a több lehetséges variáció közül.
A Unicode-os 0xa9 = 1010 1001 karakter (a copyright jel) UTF-8-as kódolása:
A 0x2260 = 0010 0010 0110 0000 karakter (a "nem egyenlő" szimbólum) kódolása:
Az Unicode specifikáció megköveteli, hogy az UTF-8 kódokat előállítók a legrövidebb lehetséges formát válasszák, például egy olyan kétbájtos sorozat, amelynek az első bájtja 0xc0, nem szabályos. Az Unicode kiadta az UTF-8 Corrigendum című dokumentumot, amelyben megtiltja a szabványt betartó programoknak, hogy elfogadjanak olyan kódokat, amelyek nem a legrövidebb formájukban érkeznek. Ennek biztonsági okai vannak: ha a felhasználó által beadott kódsorozatot ellenőrzik a biztonság érdekében, az ellenőrzés valószínűleg az "/../", ";" vagy NUL értékek ASCII formátumára terjedne csak ki, és esetleg nem gondolnak arra, hogy számos más módon lehet ezeket a jeleket az UTF-8 kódolás segítségével nem ASCII formátumban reprezentálni. Lásd még az IETF RFC 2279-et.
Néhány rendszer (amelyek a NUL-t a karakterlánc végeként értelmezik) ennek ellenére használja a C0 80 kódot a NUL (ASCII 00) karakter belső ábrázolására.
ISO 10646, Unicode 1.1, XPG4, Plan 9.
Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>
Tímár András <timar_a@freemail.hu>
1995-11-26 | Linux |