charsets(7)

NUME
charsets - standarde de seturi de caractere și internaționalizare

DESCRIERE
Această pagină de manual oferă o prezentare generală a diferitelor standarde de seturi de caractere și a modului în care acestea erau utilizate în Linux înainte ca Unicode să devină omniprezent. Unele dintre aceste informații sunt încă utile pentru persoanele care lucrează cu sisteme și documente vechi.

Printre standardele discutate se numără ASCII, GB 2312, ISO 8859, JIS, KOI8-R, KS și Unicode.

Accentul principal este pus pe seturile de caractere care au fost utilizate efectiv de seturile de caractere locale, nu pe nenumărate altele care ar putea fi găsite în datele din alte sisteme.

  ASCII
ASCII (American Standard Code For Information Interchange) este setul original de caractere pe 7 biți, conceput inițial pentru limba engleză americană. Cunoscut și sub numele de US-ASCII. În prezent, este descris de standardul ISO 646:1991 IRV (International Reference Version).

Diferite variante ASCII care înlocuiesc simbolul dolarului cu alte simboluri monetare și care înlocuiesc semnele de punctuație cu caractere alfabetice non-englezești pentru a acoperi limbile germană, franceză, spaniolă și alte limbi apărute în 7 biți. Toate acestea sunt depreciate; glibc nu acceptă localizări ale căror seturi de caractere nu sunt adevărate superseturi ale ASCII.

Deoarece Unicode, atunci când se utilizează UTF-8, este compatibil cu ASCII, textul ASCII simplu continuă să fie redat corect pe sistemele moderne care utilizează UTF-8.

  ISO 8859
ISO 8859 este o serie de 15 seturi de caractere pe 8 biți, toate având ASCII în jumătatea lor inferioară (7 biți), caractere de control invizibile în pozițiile 128-159 și 96 de caractere grafice cu lățime fixă în pozițiile 160–255.

Dintre acestea, cea mai importantă este ISO 8859-1 („Alfabetul latin nr. 1” / Latin-1). Acesta a fost adoptat și susținut pe scară largă de diferite sisteme și este înlocuit treptat cu Unicode. Caracterele ISO 8859-1 sunt, de asemenea, primele 256 de caractere din Unicode.

Suportul de consolă pentru celelalte seturi de caractere 8859 este disponibil în Linux prin intermediul utilităților din modul utilizator (cum ar fi setfont(8)) care modifică asocierile de tastatură și tabelul grafic EGA și utilizează tabelul de fonturi „user mapping” (asocierile făcute de utilizator) în controlorul de consolă.

Iată o scurtă descriere a fiecărui set de caractere:

8859-1 (Latin-1)
    Latin-1 acoperă multe limbi europene, cum ar fi albaneză, bască, daneză, engleză, feroeză, galleză, islandeză, irlandeză, italiană, norvegiană, portugheză, spaniolă și suedeză. Lipsa ligaturilor olandeză Ĳ/ĳ, franceză œ și a ghilimelelor „germane” a fost considerată tolerabilă.

8859-2 (Latin-2)
    Latin-2 acceptă multe limbi din Europa Centrală și de Est scrise în latină, cum ar fi bosniacă, croată, cehă, germană, maghiară, poloneză, slovacă și slovenă. Înlocuirea literei românești ș/ț cu ș/ț a fost considerată tolerabilă.

8859-3 (Latin-3)
    Latin-3 a fost conceput pentru a acoperi esperanto, malteză și turcă, dar 8859-9 l-a înlocuit mai târziu pentru turcă.

8859-4 (Latin-4)
    Latin-4 a introdus litere pentru limbile nord-europene, cum ar fi estonă, letonă și lituaniană, dar a fost înlocuit de 8859-10 și 8859-13.

8859-5
    Litere chirilice care sunt utilizate în limba bulgară, bielorusă, macedoneană, rusă, sârbă și (aproape în totalitate) ucraineană. Nu a fost niciodată folosit pe scară largă, a se vedea discuția despre KOI8-R/KOI8-U de mai jos.

8859-6
    A fost creat pentru limba arabă. Tabelul de glife 8859-6 este un font fix de forme de litere separate, dar un motor de afișare adecvat ar trebui să le combine folosind formele inițiale, medii și finale adecvate.

8859-7
    A fost creat pentru greaca modernă în 1987, și actualizat în 2003.

8859-8
    Acceptă ebraica modernă fără niqud (semne de punctuație). Niqud și ebraica biblică în asamblu erau în afara domeniului de aplicare al acestui set de caractere.

8859-9 (Latin-5)
    Aceasta este o variantă a Latin-1 care înlocuiește literele islandeze cu cele turcești.

8859-10 (Latin-6)
    Latin-6 a adăugat literele Inuit (groenlandeză) și Sami (laponă), care lipseau în Latin-4, pentru a acoperi întreaga zonă nordică.

8859-11
    Suportă alfabetul thailandez și este aproape identic cu standardul TIS-620.

8859-12
    Acest set de caractere nu există.

8859-13 (Latin-7)
    Suportă limbile din bazinul baltic; în special, include caractere letone care nu se găsesc în Latin-4.

8859-14 (Latin-8)
    Acesta este setul de caractere celtice, care acoperă limbile irlandeză veche, manxă, gaelică, galeză, galeză, cornișă și bretonă.

8859-15 (Latin-9)
    Latin-9 este similar cu Latin-1, folosit pe scară largă, dar înlocuiește unele simboluri mai puțin obișnuite cu semnul euro și literele franceze și finlandeze care lipseau în Latin-1.

8859-16 (Latin-10)
    Acest set acoperă mai multe limbi din sud-estul Europei și, cel mai important, asigură un suport mai complet pentru limba română decât Latin-2.

  KOI8-R / KOI8-U
KOI8-R este un set de caractere non-ISO popular în Rusia înainte de Unicode. Jumătatea inferioară este ASCII, iar cea superioară este un set de caractere chirilice ceva mai bine conceput decât ISO 8859-5. KOI8-U, bazat pe KOI8-R, are un suport mai bun pentru ucraineană. Nici unul dintre aceste seturi nu este compatibil cu ISO-2022, spre deosebire de seria ISO 8859.

Suportul de consolă pentru KOI8-R este disponibil în Linux prin intermediul utilităților în modul utilizator care modifică asocierile de tastatură și tabelul grafic EGA și utilizează tabelul de fonturi „user mapping” (asocierile făcute de utilizator) în controlorul de consolă.

  GB 2312
GB 2312 este un set de caractere standard național din China continentală utilizat pentru a exprima chineza simplificată. La fel ca în cazul JIS X 0208, caracterele sunt transpuse într-o matrice de doi octeți de 94x94 utilizată pentru a construi EUC-CN. EUC-CN este cea mai importantă codificare pentru Linux și include ASCII și GB 2312. Rețineți că EUC-CN este adesea numit GB, GB 2312 sau CN-GB.

  Big5
Big5 a fost un set de caractere popular în Taiwan pentru a exprima chineza tradițională. (Big5 este atât un set de caractere, cât și o codificare.) Este un superset al ASCII. Caracterele non-ASCII sunt exprimate în doi octeți. Octeții 0xa1–0xfe sunt utilizați ca octeți de început pentru caracterele de doi octeți. Big5 și extensia sa au fost utilizate pe scară largă în Taiwan și Hong Kong. Nu este compatibil cu ISO 2022.

  JIS X 0208
JIS X 0208 este un set de caractere standard național japonez. Deși există mai multe seturi de caractere standard naționale japoneze (cum ar fi JIS X 0201, JIS X 0212 și JIS X 0213), acesta este cel mai important. Caracterele sunt transpuse într-o matrice 94x94 de doi octeți, fiecare octet fiind cuprins în intervalul 0x21–0x7e. Rețineți că JIS X 0208 este un set de caractere, nu o codificare. Aceasta înseamnă că JIS X 0208 nu este utilizat pentru a exprima date text. JIS X 0208 este utilizat ca o componentă pentru a construi codificări precum EUC-JP, Shift_JIS și ISO-2022-JP. EUC-JP este cea mai importantă codificare pentru Linux și include ASCII și JIS X 0208. În EUC-JP, caracterele JIS X 0208 sunt exprimate în doi octeți, fiecare dintre aceștia fiind codul JIS X 0208 plus 0x80.

  KS X 1001
KS X 1001 este un set de caractere standard național coreean. La fel ca și în JIS X 0208, caracterele sunt transpuse într-o matrice de doi octeți de 94x94. KS X 1001 este utilizat, ca și JIS X 0208, ca o componentă pentru a construi codificări precum EUC-KR, Johab și ISO-2022-KR. EUC-KR este cea mai importantă codificare pentru Linux și include ASCII și KS X 1001. KS C 5601 este un nume mai vechi pentru KS X 1001.

  ISO 2022 and ISO 4873
Standardele ISO 2022 și 4873 descriu un model de control al fonturilor bazat pe practica VT100. Acest model este (parțial) acceptat de nucleul Linux și de xterm(1). Au fost definite mai multe codificări de caractere bazate pe ISO 2022, în special pentru japoneză.

Există 4 seturi de caractere grafice, denumite G0, G1, G2 și G3, iar unul dintre acestea este setul de caractere curent pentru codurile cu bitul mare zero (inițial G0) și unul dintre ele este setul de caractere curent pentru codurile cu bitul mare unu (inițial G1). Fiecare set de caractere grafice are 94 sau 96 de caractere și este, în esență, un set de caractere pe 7 biți. Acesta utilizează codurile 040–0177 (041–0176) sau 0240–0377 (0241–0376). G0 are întotdeauna dimensiunea 94 și utilizează codurile 041–0176.

Trecerea de la un set de caractere la altul se face cu ajutorul funcțiilor de deplasare ^N (SO sau LS1), ^O (SI sau LS0), ESC n (LS2), ESC o (LS3), ESC N (SS2), ESC O (SS3), ESC ~ (LS1R), ESC } (LS2R), ESC | (LS3R). Funcția LSn face ca setul de caractere Gn să fie cel curent pentru codurile cu bitul mare zero. Funcția LSnR face ca setul de caractere Gn să fie cel curent pentru codurile cu bitul 1 mare. Funcția SSn face ca setul de caractere Gn (n=2 sau 3) să fie cel curent numai pentru următorul caracter (indiferent de valoarea bitului de ordin înalt al acestuia).

Un set de 94 de caractere este desemnat ca set de caractere Gn printr-o secvență de eludare ESC ( xx (pentru G0), ESC ) xx (pentru G1), ESC * xx (pentru G2), ESC + xx (pentru G3), unde xx este un simbol sau o pereche de simboluri din Registrul internațional al seturilor de caractere codificate ISO 2375. De exemplu, ESC ( @ selectează setul de caractere ISO 646 ca G0, ESC ( A selectează setul de caractere standard din Marea Britanie (cu lira sterlină în loc de simbolul monetar), ESC ( B selectează ASCII (cu dolarul în loc de simbolul monetar), ESC ( M selectează un set de caractere pentru limbile africane, ESC ( ! A selectează setul de caractere cubanez, și așa mai departe.

Un set de 96 de caractere este desemnat ca set de caractere Gn printr-o secvență de eludare ESC - xx (pentru G1), ESC . xx (pentru G2) sau ESC / xx (pentru G3). De exemplu, ESC - G selectează alfabetul ebraic ca fiind G1.

Un set de caractere multiocteți este desemnat ca set de caractere Gn printr-o secvență de eludare ESC $ xx sau ESC $ ( xx (pentru G0), ESC $ ) xx (pentru G1), ESC $ * xx (pentru G2), ESC $ + xx (pentru G3). De exemplu, ESC $ ( C selectează setul de caractere coreene pentru G0. Setul de caractere japoneze selectat prin ESC $ B are o versiune mai recentă selectată prin ESC & @ ESC $ B.

ISO 4873 stipulează o utilizare mai restrânsă a seturilor de caractere, în care G0 este fix (întotdeauna ASCII), astfel încât G1, G2 și G3 pot fi invocate numai pentru codurile cu bitul de ordin înalt setat. În special, ^N și ^O nu mai sunt utilizate, ESC ( xx poate fi utilizat numai cu xx=B, iar ESC ) xx, ESC * xx, ESC + xx sunt echivalente cu ESC - xx, ESC . xx, ESC / xx, respectiv ESC / xx.

  TIS-620
TIS-620 este un set de caractere standard național thailandez și un superset al ASCII. În același mod ca și în cazul seriei ISO 8859, caracterele thailandeze sunt transpuse în intervalul 0xa1–0xfe.

  Unicode
Unicode (ISO/IEC 10646) este un standard care are ca scop reprezentarea fără ambiguitate a fiecărui caracter din fiecare limbă umană. Structura Unicode permite codificarea fiecărui caracter pe 20,1 biți. Deoarece majoritatea calculatoarelor nu includ numere întregi pe 20,1 biți, Unicode este de obicei codificat ca numere întregi pe 32 de biți la nivel intern și fie ca o serie de numere întregi pe 16 biți (UTF-16) (având nevoie de două serii de numere întregi pe 16 biți doar la codificarea anumitor caractere rare), fie ca o serie de octeți pe 8 biți (UTF-8).

Linux reprezintă Unicode utilizând formatul de transformare Unicode pe 8 biți (UTF-8). UTF-8 este o codificare cu lungime variabilă a Unicode. Acesta utilizează 1 octet pentru a codifica 7 biți, 2 octeți pentru 11 biți, 3 octeți pentru 16 biți, 4 octeți pentru 21 de biți, 5 octeți pentru 26 de biți, 6 octeți pentru 31 de biți.

Fie că 0,1,x reprezintă un zero, unu sau un bit arbitrar. Un octet 0xxxxxxx reprezintă Unicode 00000000 0xxxxxxx, care codifică același simbol ca și ASCII 0xxxxxxx. Astfel, ASCII rămâne neschimbat în UTF-8, iar persoanele care folosesc doar ASCII nu observă nicio schimbare: nici în cod, nici în dimensiunea fișierului.

Un octet 110xxxxx este începutul unui cod de 2 octeți, iar 110xxxxx 10yyyyyyyy este asamblat în 00000xxx xxyyyyyyy. Un octet 1110xxxx reprezintă începutul unui cod de 3 octeți, iar 1110xxxx 10yyyyyyyyyy 10zzzzzzzz este asamblat în xxxxyyyyyy yyzzzzzzzzzz. (Atunci când se utilizează UTF-8 pentru a codifica ISO/IEC 10646 pe 31 de biți, această progresie continuă până la coduri de 6 octeți).

Pentru majoritatea textelor din seturile de caractere ISO 8859, acest lucru înseamnă că toate caracterele din afara ASCII sunt acum codificate cu doi octeți. Acest lucru tinde să extindă fișierele de text obișnuite cu doar unul sau două procente. În cazul textelor în rusă sau greacă, fișierele de text obișnuite se măresc cu 100%, deoarece textele din aceste limbi sunt în mare parte în afara ASCII. Pentru utilizatorii japonezi, acest lucru înseamnă că codurile pe 16 biți utilizate în prezent în mod obișnuit vor necesita trei octeți. Deși există conversii algoritmice de la unele seturi de caractere (în special ISO 8859-1) la Unicode, conversia generală necesită utilizarea unor tabele de conversie, care pot fi destul de mari pentru codurile pe 16 biți.

Rețineți că UTF-8 se autosincronizează: 10xxxxxx este o coadă, orice alt octet este capul unui cod. Rețineți că singurul mod în care apar octeți ASCII într-un flux UTF-8 este ca atare. În special, nu există NUL-uri încorporate ('\0') sau '/'s care fac parte dintr-un cod mai mare.

Deoarece ASCII și, în special, NUL și '/', sunt neschimbate, nucleul nu observă că se utilizează UTF-8. Nu-i pasă deloc ce reprezintă octeții pe care îi manipulează.

Redarea fluxurilor de date Unicode este de obicei gestionată prin intermediul tabelelor de "subfonturi" care transpun un subset de Unicode în glife. La nivel intern, nucleul utilizează Unicode pentru a descrie subfontul încărcat în memoria RAM video. Acest lucru înseamnă că în consola Linux în modul UTF-8 se poate utiliza un set de caractere cu 512 simboluri diferite. Acest lucru nu este suficient pentru japoneză, chineză și coreeană, dar este suficient pentru majoritatea celorlalte scopuri.

CONSULTAȚI ȘI
iconv(1), ascii(7), iso_8859-1(7), unicode(7), utf-8(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost creată de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă Nicio RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.