A c nyelvi könyvtár a gnu glibc karakter kiterjesztéssel

Számos nyelv olyan karakterkészleteket használ, amelyek nagyobbak, mint a char értékek.

A japán és a kínai talán a legközelebbi példa.

A GNU C könyvtár két mechanizmust támogat a kiterjesztett karakterkészletekhez: több-bájtos karakterek és széles karakterek. Ez a fejezet leírja, hogyan kell használni ezeket a mechanizmusokat, és azokat a funkciókat, amelyekkel konvertálni lehet őket.

Ha a rendszer támogatja a karakterkiterjesztéseket, akkor támogatja őket, akár több-bájtos karakterekként, akár kiterjesztett karakterekként. A könyvtár olyan funkciókat tartalmaz, amelyeket két nézet között konvertálhat. Ezeket a funkciókat ebben a fejezetben ismertetjük.

A számítógépes rendszer több, több bájtos karakterkódot és több kiterjesztett karakterkódot is támogathat. A felhasználó szabályozza a kódok kiválasztását a karakterosztály jelenlegi szabványán (lásd a 19. fejezetet [Szabványok]). Minden szabvány meghatároz egy konkrét multibyte karakterkódot és egy speciális kiterjesztett karakterkódot. A szabvány kiválasztása befolyásolja a könyvtárban található konverziós funkciók viselkedését.

Egyes szabványok nem támogatják a kiterjesztett karaktereket vagy a nem triviális többszörös karaktereket. Ezekben a szabványokban a könyvtári konverziós funkciók még mindig működnek, még akkor is, ha alapvetően triviálisak.

Ha új normát választasz a karakterek osztályozásához, akkor ezek a funkciók által támogatott belső offset-paraméter zavarba hozható, ezért ne változtassa meg a szabványt, amíg a karakterlánc feldolgozásának közepén tartózkodik.

A szokásos ASCII kódnál a karakterek sorozata egy byte sorozata, és minden karakter egy bájt. Nagyon egyszerű, de csak 256 különböző karaktert veszi figyelembe.

Egy többbit karakterkódban a karakterek sorozata egy byte sorozata, de minden karakter elfoglalhatja a sorrend egy vagy több egymást követő byte-ját.

Sokféleképpen lehet több bájtos karakterkódot megtervezni; a különböző rendszerek különböző kódokat használnak. Egy specifikus kódolási módot az alapbájtszekvenciák kijelölése határoz meg, amelyek egyetlen karaktert képviselnek, és melyik karaktereket cserélik ki. Az a kód, amelyet a számítógép ténylegesen használhat, véges számú ilyen alapszekvenciának kell lennie, és általában egyikük sem több, mint néhány karakter.

Ezek a szekvenciák nem ugyanolyan hosszúak. Valójában sok közülük csak egy byte. Mivel a 0-tól 0177-ig terjedő alapvető ASCII karakterek olyan fontosak, hogy minden többbyte karakterkódban helyettesítik magukat. Vagyis egy byte, amelynek értéke 0-tól 0177-ig mindig szimbólum. Az egy bájtnál nagyobb karakterek mindig 0200 és 0377 közötti bájtból indulnak.

A karakterlánc megszüntetéséhez 0 bájt érték használható, ahogy gyakran használják egy ASCII karakterláncban.

Az egy karakteres karaktereket tartalmazó alapbájtszekvenciák meghatározása automatikusan megadja az értékeket hosszabb bájtszekvenciákhoz, több mint egy karaktert. Például, ha egy szekvencia két byte 0205 049 helyettesíti egy szimbólum a görög Alpha, a 0205 049 065 kell cserélni az alfa, majd a „” (ASCII kódja 065) és a 0205 049 049 0205 kell cserélni a két alfajának egy sorban.

Ha bármelyik byte sorozata több karakterből állhat, akkor a multibyte kód kétértelmű és veszélyes. A rendszerek által használt kódok mind egyértelműek.

A legtöbb kódban vannak olyan byte-sorozatok, amelyek szimbólumként vagy szimbólumként nem értelmezhetők. Elfogadhatatlanok.

A legegyszerűbb lehetséges többbájtos kód triviális:

Az alapvető szekvenciák egy byte-ból állnak.

Ez a kód nem használ sokszoros karaktert. Nincs érvénytelen sorozata. De képes kezelni csak 256 különböző karaktert.

Itt van egy másik lehetséges kód, amely 9376 karaktert képes kezelni:

Az alapvető szekvenciák tartalmazzák
  • egy byte értékkel, 0 és 0237 között.
  • kétbájtos szekvenciák, amelyekben mindkét bájt értékek a 0240-től 0377-ig terjedő tartományban vannak.

Ezt a kódot vagy hasonlót egyes rendszereknél használják a japán karakterek megjelenítéséhez. Az érvénytelen szekvenciák olyanok, amelyek páratlan számú egymást követő bájtból állnak a 0240-től 0377-ig terjedő tartományban.

Itt van egy másik, több bájtos kód, amely több különböző kiterjesztett karaktert képes kezelni, valójában közel harminc millió:

Az alapvető szekvenciák tartalmazzák
  • egy byte-ot, amelyek értéke 0 és 0177 között van.
  • legfeljebb négy bájt, amelyben az első bájt a 0200 és 0237 közötti tartományban van, és a fennmaradó bájtok a 0240-től 0377-ig terjedő tartományban vannak.
Ebben a kódban minden olyan sorrend, amely a 0240 és 0377 közötti bájtból indul, érvénytelen.

Itt van egy másik lehetőség, amelynek előnye: ha törli az érvényes karakter utolsó bájtját vagy bájtjait, akkor soha nem lát más érvényes karaktert.

Az alapvető szekvenciák tartalmazzák
  • egy bájt, 0-tól 0177-ig terjedő értékekkel.
  • kétbájtos szekvenciák, amelyekben az első bájt a 0200 és 0207 közötti tartományban van, és a második bájt a 0240-től 0377-ig terjedő tartományba esik.
  • három bájtos szekvenciák, amelyekben az első bájt a 0210-től 0217-ig terjed, és a többi bájt a 0240-től 0377-ig terjedő tartományba esik.
  • négybájtos szekvenciák, amelyekben az első bájt a 0220-tól 0227-ig terjedő tartományban van, és a többi bájt a 0240-től 0377-ig terjedő tartományba esik.

A lehetséges multibyte kódok száma nagyon nagy. De ez a számítógépes rendszer nem csak néhány különböző kódot támogat. (Az egyik kód több ezer különböző karaktert is figyelembe vehet.) Egy másik számítógépes rendszer támogatja a teljesen más kódot. Az ebben a fejezetben ismertetett könyvtári eszközök hasznosak, mivel leírják az adott számítógépes rendszer több bájtos kódját, bár a programoknak nem kell tudniuk.

Akkor speciális normál makrók, hogy megtalálják a lehető legnagyobb számú karakter byte a jelenlegi multibyte kód MB_CUR_MAX használja ki, és a maximális bármely multibyte kódot, amennyiben a számítógépen lévő MB_LEN_MAX. Ez az összes támogatott szabványú multibyte karakter maximális hossza. A "limits.h" -ben van megadva. Ez a makró (esetleg nem állandó) pozitív egész számot jelenít meg, amely a jelenlegi szabványban lévő többbit karakterben lévő bájtok maximális száma. Az érték soha nem haladja meg az MB_LEN_MAX értéket.

Az MB_CUR_MAX a "stdlib.h" -ben van megadva.

Mi történik, ha megpróbálsz átadni egy olyan karakterláncot, amely multibyte funkció karaktereket tartalmaz, amelyekről nem tudnak róluk? Általában egy ilyen függvény a stringet bájtsorként kezeli, és bizonyos értékeket értelmez; minden más byte érték "közös". Ha egy több bájtos karakter nem tartalmaz speciális bájtértéket, akkor a függvénynek feldolgoznia kell, mintha különálló bájtok lennének.

A kibővített karakterek sokkal könnyebbek, mint a több bájtos karakterek. Ezek csak szimbólumok, amelyek több mint nyolc bitet tartalmaznak, így több mint 256 különböző kódra vonatkoznak. A wchar_t kiterjesztett karakteradat-típusnak elég nagy tartománya van ahhoz, hogy kiterjesztett karakterkódokat és hagyományos ASCII kódokat tartalmazzon.

Ha a rendszer támogatja a kiterjesztett karaktereket, akkor minden egyes kiterjesztett karakter kiterjesztett karakterkóddal és a megfelelő multibyte alapszekvenciával rendelkezik.

Ebben a fejezetben a kifejezés kódot egyetlen kiterjesztett szimbólum objektumra utal, hogy hangsúlyozza a char adatok típusától való eltérést.

Az mbstowcs függvény egy többbyte karakterből álló sorozatot alakít ki kiterjesztett karakterek tömbjéhez. A wcstombs funkciója fordított folyamat. Ezeket a funkciókat a "stdlib.h" fejlécfájlban deklarálják.

A legtöbb programban ezek a funkciók az egyetlen igényt a hosszabb és többszörös karakterlánc közötti átváltásra. De vannak korlátai. Ha az adatok nem null-terminált, vagy - nem egyszerre, a kernel, akkor szükség lehet használni az alacsony szintű átalakítás funkció átalakítani egy karaktert egy időben. Lásd a 18.7 [Egyetlen szimbólum konvertálása] részt. mbstowcs ( „több-bájtos karakterláncot egy sor széles karakter”) függvény átalakítja a null-végű karakterláncot a végén a több-bájtos karaktereket egy sor széles karakterek, miközben nem több, mint a méret a kiterjesztett karakterek a tömbben kezdődő wstring. A lezáró null karakter kiszámítása ágy, így ha mérete kisebb, mint a tényleges száma széles karaktert a következő sort, nincs lezáró null karakter nem kerül mentésre.

A karakterláncok karakterláncból történő konvertálása a regiszter kezdeti paraméterével kezdődik.

Ha érvénytelen, több bájtos karakterláncot talál, a függvény -1 értéket ad vissza. Ellenkező esetben a wstring tömbben tárolt kiterjesztett karakterek számát adja vissza. Ez a szám nem tartalmazza az üres befejezési karaktert, amely jelen van, ha a szám kisebb, mint a méret.

Íme egy példa, amely bemutatja, hogyan alakítható át egy több bájtos karakterlánc, és elegendő helyet foglaljon el az eredményhez. A wcstombs a kibővített karakterek tömbjét egy null karakterrel egészíti ki egy több bájtos karaktert tartalmazó karakterlánccal, megtartva legfeljebb a méretbájtokat, kezdve a stringvel.

Ha olyan kódot talál, amely nem egy érvényes többbyte karakter, akkor ez a függvény -1 értéket ad vissza. Ellenkező esetben a visszatérési érték a tömbben tárolt bájtok száma. Ez a szám nem tartalmazza az üres befejezési karaktert, amely jelen van, ha a szám kisebb, mint a méret.

Visszatérési érték mblen megkülönbözteti három lehetőség van: az első mérete byte sorban kezdeni érvényes több bájtos karaktert, akkor kezdje érvénytelen bytesorozatot, vagy csak egy részét karakter vagy jelzi, egy üres sort (üres karakter).

Egy megengedhető több bájtos karakter esetén az mblen visszaadja a bájtok számát ebben a szimbólumban (mindig legalább 1, és soha nem nagyobb, mint a méret). A bájtok érvénytelen sorrendjéhez a mblen visszatér -1 értékre. Egy üres karakterlánc esetén 0 értéket ad vissza.

Ha egy több bájtos karakterkód használ case-change karaktereket, akkor mblen, támogatja és módosítja a regisztrációs paramétert. Ha a mblen-t null mutatóval hívja egy stringhez, inicializálja a regisztrációs paramétert az alapértelmezett kezdeti értékre. Lásd a 18.9 Szakasz [Regiszterparaméter] részt.

A mblen függvényt "stdlib.h" -ként deklarálják.

A több bájtos karaktereket egyenként bővítheti kiterjesztett karakterekké az mbtowc függvény használatával. A Wctomb funkció ellentétes. Ezeket a funkciókat a "stdlib.h" -ben deklarálják. A Mbtowc átalakítja az első többszörös karaktert karakterláncba a megfelelő kiterjesztett karakterkóddal. Az eredményt * eredményre menti. A Mbtowc soha nem keres többet, mint a méretbájtokat. (Az ötlet az, hogy a méret a bájtok számát az adatok, hogy van.) Mbtowc egy nem üres karakterláncot Visszatérési érték mblen megkülönbözteti három lehetőség van: az első méretét byte a húr kezdeni érvényes több bájtos karaktert, akkor kezdődik egy érvénytelen bytesorozatot vagy csak egy részét karakter vagy karakterlánc egy üres karaktert (üres karaktert) jelez.

Egy megengedhető több bájtos karakter esetén az mbtowc kiterjesztett karakterré alakítja, tárolja * result-ban, és visszaadja a bájtok számát abban a karakterben (mindig legalább 1, és soha nem nagyobb, mint a méret).

A bájtok érvénytelen sorrendjéhez a mbtowc visszatér 1. Az üres karakterlánchoz 0-nak ad vissza, és 0-t is * eredményben tart. A wctomb függvény átalakítja a wchar kiterjesztett karakterkódot a megfelelő multibyte karakterláncba, és az eredményt stringekkel kezdődő bájtokból tárolja. A nem üres karakterláncú Wctomb megkülönbözteti a wchar-tól három lehetséges lehetőséget: érvényes kiterjesztett karakterkódot (egy, amely több bájtos karakterre lefordítható), érvénytelen kódot és 0-t.

Ha a wchar egy érvénytelen kiterjesztett karakterkód, a wctomb értéke -1. Ha a wchar értéke 0, akkor 0 értéket ad meg, és a stringet 0-ban is tartja.

Ha ezt a funkciót nullás wchar argumentummal hívjuk, ha a karakterlánc nem üres karakter, akkor a mellékregisztráló paraméter újbóli inicializálása mellékhatása, valamint a 0 többszörös karakter és a 0 visszaadása.

Íme egy példa, amely több bemeneti karakterű szöveget olvas a bemeneti leírásból, és a megfelelő kiterjesztett karaktereket a kimeneti leírásba írja. A példában szereplő karaktereket egyenként kell átalakítani, mert az mbstowcs nem tud folytatni az üres karakter után, és nem tud megbirkózni a látszólag érvénytelen részleges karakterrel, ha nagy mennyiségű bemenetet olvas.

Néhány multibyte karakterkódban az adott bájtszekvencia értéke nem rögzített; a többi, ugyanazon sorban korábban tárgyalt szekvenciától függ. Általában csak néhány szekvencia van, amely megváltoztathatja a többi szekvencia értékét; ezeket a néhányat regiszter szekvenciáknak nevezzük, és azt mondjuk, hogy a többi szekvenciához a regiszter paramétert állítják be.

Annak illusztrálására, a regiszter állapotban, és regisztrálja a szekvenciát, tegyük fel, megállapítjuk, hogy a szekvenciája 0200 (csak egy bájt) belép japán mód, amelyben pár byte tartományban 0240-0377 egyszeres szimbólumok, míg 0201 bevezeti Latin-1 módban amelyben egyetlen bájtot tartományban 0240-0377 szimbólumok és értelmezik szerint egy sor Latin-1 karakter, a Nemzetközi szabványügyi szervezet. Ez - a több-bájtos kód, amely két alternatív állapot regiszter ( „Japán mód” és a „Latin-1 üzemmód”), két nyilvántartások és szekvenciák, amelyek meghatározzák adott állapot regiszter.

Íme egy példa az mblen használatára ezekkel a szabályokkal: a mblen, az mbtowc és a wctomb nem használatos, ha multibyte kódot használ, amely a regiszter állapotát használja. Azonban a többi könyvtári funkció nem hívja fel ezeket a funkciókat, így nem kell aggódnia.