Un număr de limbi utilizează seturi de caractere care sunt mai mari decât un set de valori char.
Japonezii și chinezii sunt probabil exemplele cele mai apropiate.
Biblioteca GNU C include suport pentru două mecanisme de lucru cu seturi de caractere extinse: caractere multibyte și caractere largi. Acest capitol descrie modul de utilizare a acestor mecanisme și funcțiile de conversie între ele.
Dacă sistemul acceptă extensii de caractere, atunci le acceptă, atât ca caractere multibyte, cât și ca caractere extinse. Biblioteca include funcții pe care le puteți utiliza pentru a converti între două vizualizări. Aceste funcții sunt descrise în acest capitol.
Un sistem informatic poate suporta mai mult de un cod de caractere multibyte și mai mult de un cod de caractere extins. Utilizatorul controlează selecția codurilor prin standardul actual de clasificare a caracterelor (vezi capitolul 19 [Standarde]). Fiecare standard definește un anumit cod de caractere multibyte și un anumit cod de caractere extins. Alegerea standardului afectează comportamentul funcțiilor de conversie din bibliotecă.
Unele standarde nu acceptă nici caractere extinse, nici caractere non-trivial multibyte. În aceste standarde, funcțiile de conversie ale bibliotecii continuă să funcționeze, chiar dacă acestea sunt practic triviale.
Dacă selectați un nou standard pentru clasificarea caracterelor, parametrul de offset intern susținut de aceste funcții poate deveni confuz, deci nu schimbați standardul în timp ce vă aflați în mijlocul procesării șirului.
În codul obișnuit ASCII, secvența de caractere este o secvență de octeți și fiecare caracter este un octet. Este foarte simplu, dar ia în considerare doar 256 de caractere diferite.
Într-un cod de caractere multibyte, secvența de caractere este o secvență de octeți, dar fiecare caracter poate ocupa unul sau mai mulți octeți consecutivi ai secvenței.
Există multe modalități diferite de a crea un cod de caractere multibyte; sistemele diferite utilizează coduri diferite. O metodă specifică de codare este definită de desemnarea secvențelor de byte de bază care reprezintă un singur caracter și de caracterele pe care le înlocuiesc. Codul pe care îl poate utiliza un computer trebuie să aibă un număr finit de secvențe de bază și, de obicei, nici unul dintre ele nu depășește câțiva caractere.
Aceste secvențe nu au aceeași lungime. De fapt, multe dintre ele sunt doar un octet. Deoarece caracterele ASCII de bază în intervalul de la 0 la 0177 sunt atât de importante încât se înlocuiesc în toate codurile de caractere multiple. Acesta este un octet a cărui valoare de la 0 la 0177 este întotdeauna un simbol în sine. Caracterele care sunt mai mari decât un octet trebuie să înceapă întotdeauna cu un byte în intervalul de la 0200 la 0377.
O valoare de 0 octeți poate fi folosită pentru a termina un șir, așa cum este adesea folosit într-un șir de caractere ASCII.
Definiția secvențelor de octet de bază care reprezintă caractere unice dă automat valori secvențelor octeților mai lungi, mai mult de un caracter. De exemplu, în cazul în care o secvență de doi octeți 0205 049 înlocuiește un simbol al Alpha elen, 0205 049 065 ar trebui să înlocuiască alfa, urmat de „“ (cod ASCII 065) și 0205 049 049 0205 ar trebui să înlocuiască cele două versiunile alfa într-un rând.
Dacă o secvență de octeți poate avea mai mult de o valoare ca secvență de caractere, atunci codul multibyte este ambiguu și periculos. Codurile pe care sistemele le folosesc efectiv sunt toate neechivoce.
În majoritatea codurilor, există câteva secvențe de octeți care nu au nici un sens ca simbol sau simboluri. Ele sunt numite inacceptabile.
Cel mai simplu cod posibil multi-octet este trivial:
Secvențele de bază constau din octeți unici.
Acest cod special nu utilizează deloc caractere multibyte. Nu are secvențe invalide. Dar se poate ocupa doar de 256 de caractere diferite.
Iată un alt cod posibil care poate gestiona 9376 de caractere diferite:
Secvențele de bază constau din- singur octeți cu valori cuprinse între 0 și 0237.
- secvențe de două octeți în care ambii octeți au valori cuprinse între 0240 și 0377.
Acest cod sau similar este folosit în unele sisteme pentru a reprezenta caractere japoneze. Secvențele nevalide sunt cele care constau dintr-un număr impar de octeți consecutivi în intervalul 0240 - 0377.
Aici este un alt cod multi-octet care se poate ocupa de mai multe personaje extinse, de fapt, aproape treizeci de milioane:
Secvențele de bază constau din- un singur octet cu valori cuprinse între 0 și 0177.
- secvențe de până la patru octeți în care primul octet este în intervalul de la 0200 la 0237, iar restul de octeți sunt în intervalul de la 0240 la 0377.
Iată o altă opțiune care are avantajul: atunci când ștergeți ultimul byte sau octeți ai unui caracter valid, nu puteți vedea niciodată un alt caracter valid.
Secvențele de bază constau din- un singur octet cu valori cuprinse între 0 și 0177.
- secvențe de două octeți în care primul octet se află în intervalul de la 0200 la 0207, iar cel de-al doilea octet este în domeniul de la 0240 la 0377.
- secvențe de trei octeți în care primul octet se află în intervalul 0210 până la 0217, iar ceilalți octeți se află în domeniul de la 0240 la 0377.
- secvențe de patru octeți în care primul octet este în intervalul de la 0220 la 0227, iar ceilalți octeți sunt în domeniul de la 0240 la 0377.
Numărul de coduri posibile pentru mai multe bilete este foarte mare. Dar acest sistem informatic nu va suporta mai mult de câteva coduri diferite. (Unul dintre aceste coduri poate reprezenta mii de caractere diferite.) Un alt sistem de calculator poate suporta un cod complet diferit. Instrumentele de bibliotecă descrise în acest capitol sunt utile deoarece descriu detaliile codului multi-octet al unui anumit sistem informatic, deși programele dvs. nu trebuie să știe.
Puteți utiliza macro-uri speciale standard pentru a găsi numărul maxim posibil de octeți de caractere în codul multibyte curent MB_CUR_MAX Utilizare off, iar valoarea maximă pentru orice cod multibyte furnizat pe computer este conținută în MB_LEN_MAX. Aceasta este lungimea maximă a unui caracter multibyte pentru orice standard acceptat. Acesta este definit în "limits.h". Aceasta afișează macro (eventual non-constant) de exprimare cu un număr întreg pozitiv, care este numărul maxim de octeți într-un caracter multioctet în standardul actual. Valoarea nu este niciodată mai mare decât MB_LEN_MAX.
MB_CUR_MAX este definită în "stdlib.h".
Ce se întâmplă dacă încercați să transmiteți un șir care conține caractere cu funcție multibyte care nu știu despre ele? De obicei, o astfel de funcție tratează șirul ca o secvență de octeți și interpretează anumite valori în special; toate valorile celorlalte octeți sunt "comune". Dacă un caracter multibyte nu conține o valoare octet specială, funcția trebuie să o proceseze, ca și când acestea ar fi caractere obișnuite.
Caracterele extinse sunt mult mai ușoare decât caracterele multibyte. Ele sunt doar simboluri cu mai mult de opt biți, astfel încât să aibă loc pentru mai mult de 256 de coduri diferite. Tipul de date extins pentru caractere wchar_t are o gamă suficient de mare pentru a conține coduri de caractere extinse, precum și coduri tradiționale ASCII.
Dacă sistemul dvs. acceptă caractere extinse, fiecare caracter extins are atât un cod de caractere extins, cât și o secvență de bază multibyte corespunzătoare.
În acest capitol, termenul de cod este folosit pentru a se referi la un singur obiect simbol extins pentru a sublinia diferența față de tipul de date char.
Funcția mbstowcs convertește un șir de caractere multibyte într-o serie de caractere extinse. Funcția wcstombs face procesul invers. Aceste funcții sunt declarate în fișierul header "stdlib.h".
În majoritatea programelor, aceste funcții sunt singura necesitate de conversie între șiruri de caractere extinse și șiruri de caractere multibyte. Dar au limitări. Dacă datele dvs. nu sunt cu un caracter nul la sfârșit sau - nu toate în kernelul dintr-o dată, probabil că ar trebui să utilizați funcțiile de conversie la nivel inferior pentru a converti câte un caracter la un moment dat. Vezi secțiunea 18.7 [Convertirea unui simbol unic]. mbstowcs ( „string multibyte la un șir de caractere late“) funcție convertește șirul terminat-nul la sfârșitul caracterelor multioctet într-o matrice de caractere late, păstrând mai mult decât dimensiunea caracterelor extinse în matrice care pornește de la wstring. Caracterul nul terminare se calculează pat, așa că, dacă dimensiunea este mai mic decât numărul real de caractere late de linia următoare, niciun caracter nul de încheiere nu este salvat.
Conversia caracterelor de la șir începe cu parametrul inițial al registrului.
Dacă este găsit un șir invalid de caractere multibyte, funcția returnează -1. În caz contrar, returnează numărul de caractere extins stocate în matricea wstring. Acest număr nu include caracterul de completare gol care este prezent dacă numărul este mai mic decât dimensiunea.
Iată un exemplu care arată cum să convertiți un șir de caractere multibyte, rezervând suficient spațiu pentru rezultat. wcstombs convertește o serie de caractere extinse cu un caracter nul la sfârșitul unui șir care conține caractere multibyte, salvând nu mai mult decât octeți de dimensiune, începând cu șir.
Dacă găsiți un cod care nu corespunde unui caracter multibyte valid, această funcție returnează -1. În caz contrar, valoarea returnată este numărul de octeți stocați în matrice. Acest număr nu include caracterul de completare gol care este prezent dacă numărul este mai mic decât dimensiunea.
mblen Valoarea returnata distinge trei posibilități: primii octeți dimensiunea de începere rând cu caracter multioctet, acestea încep cu secvența de octeți invalidă sau doar o parte dintr-un caracter sau șir de caractere indică o linie goală (caractere gol).
Pentru un caracter multibyte permis, mblen returnează numărul de octeți în acest simbol (întotdeauna cel puțin 1 și niciodată mai mare decât dimensiunea). Pentru o secvență invalidă de octeți, mblen returnează -1. Pentru un șir gol, acesta returnează 0.
Dacă un cod de caractere multibyte utilizează caractere de schimbare a cazului, atunci mblen suporta și modifică parametrul de înregistrare. Dacă apelați mblen cu un pointer nul pentru un șir, inițializează parametrul registrului la valoarea inițială prestabilită. Vezi secțiunea 18.9 [Parametru înregistrare].
Funcția mblen este declarată în "stdlib.h".
Puteți converti caractere multi-byte în caractere extinse într-o singură funcție mbtowc. Funcția Wctomb face opusul. Aceste funcții sunt declarate în "stdlib.h". Mbtowc convertește primul caracter multibyte din șirul de caractere în codul larg corespunzător. Salvează rezultatul în * rezultat. Mbtowc nu explorează mai mult decât octeți de mărime. (. Ideea este de a permite pentru dimensiunea numărul de octeți de date pe care le-ați) Mbtowc o valoare non-gol șir de retur mblen distinge trei posibilități: primii octeți de mărime din șirul începe cu caracter multioctet, acestea încep cu o secvență de octet invalid sau doar o parte caracter sau șir indică un șir gol (un caracter gol).
Pentru un caracter multioctet, îl convertește la mbtowc caracter avansat, îl stochează în * rezultat, și returnează numărul de octeți în acel caracter (întotdeauna cel puțin 1, și niciodată nu bololshe decât dimensiunea).
Pentru o secvență invalidă de octeți, mbtowc returnează 1. Pentru un șir gol, acesta returnează 0, păstrând de asemenea 0 în * rezultat. Funcția wctomb convertește codul de caractere extins wchar la șirul de caractere multibyte corespunzător și stochează rezultatul în octeți începând cu șir. Wctomb cu un șir ne-gol distinge trei posibilități pentru wchar: un cod valid de caractere extins (unul care poate fi tradus într-un caracter multibyte), un cod nevalid și 0.
Dacă wchar este un cod invalid caracter extins, wctomb returnează -1. Dacă wchar este 0, ea returnează 0, de asemenea păstrând 0 în * string.
Apelarea acestei funcții cu un argument wchar zero, atunci când șirul nu este un caracter gol, are efectul secundar de reinitializare a parametrului înregistrat al memoriei, precum și salvarea caracterului multibyte 0 și returnarea lui 0.
Aici este un exemplu care citește textul mnogobaytovoy caractere de la intrare descriptor și scrie caractere late corespunzătoare de ieșire descriptor. Noi trebuie să converti caracterele unul câte unul, în acest exemplu, pentru că mbstowcs în imposibilitatea de a continua după caracterul nul, și nu poate face față evident caracterul parțial inacceptabilă lectură o cantitate mare de intrare.
În unele coduri de caractere multibyte, valoarea oricărei secvențe de byte nu este fixă; depinde de celelalte secvențe discutate anterior în același rând. De obicei, există doar câteva secvențe care pot schimba valoarea altor secvențe; aceste cateva se numesc secvente de registru, si spunem ca ele stabilesc parametrul registrului pentru celelalte secvente care urmeaza.
Pentru a ilustra starea de registru, și înregistrează secvența, să presupunem că stabili că secvența de 0200 (un singur octet) intră în modul japoneză, în care perechile de octeți în intervalul de la 0240 până la 0377 sunt simboluri unice, în timp ce 0201 introduce modul Latin-1 în care octeți unice în intervalul de la 0240 până la 0377 sunt simboluri și sunt interpretate în conformitate cu un set de latin-1 caracter al organizaţiei Internaționale de standardizare. Acest - cod multibyte care are două registru statut alternativ ( „modul Japonia“ și „modul latin-1“), două registre și secvențe care determină registru statut specific.
Iată un exemplu de utilizare a mblen cu aceste reguli: mblen, mbtowc și wctomb nu sunt folosite atunci când se utilizează codul multibyte care folosește starea registrului. Cu toate acestea, nici alte funcții ale bibliotecii nu apelează aceste funcții, deci nu trebuie să vă faceți griji.