În informatică , un șir de caractere este atât conceptual o secvență ordonată de caractere, cât și fizic o secvență ordonată de unități de cod ( unitate de cod ). Șirul este un tip de date în multe limbi de computer . Traducerea în engleză este șir .
În zilele pionierilor, confundam în mod obișnuit șir de caractere și șir de octeți, ceea ce duce la confuzie astăzi, când nu vrem să ne limităm la 255 de caractere. Prin extensie, vorbim despre un șir binar pentru a descrie o secvență de octeți .
Unele limbi preferă să gestioneze șiruri de caractere de pe unități pe 16 biți.
În Unicode , tipul de date „șir Unicode” este o secvență ordonată de „unități de cod”.
Majoritatea limbajelor de programare oferă o clasă sau un tip destinat reprezentării și manipulării șirurilor.
Limba | Tipul de date | Descriere |
---|---|---|
Piton | str, unicode | A fost schimbat cu Python 3.0. |
Java | java.lang.String | De la originea lor, șirurile Java au fost șiruri Unicode . |
VS | char* și char[] | Limbajul C nu a cunoscut niciodată un tip de șir adevărat. Șirurile de caractere sunt de obicei simulate de un pointer la o secvență de caractere cu un singur octet care se termină cu un octet nul. Unele biblioteci există pentru a gestiona șirurile, în special pentru a depăși limitele șirurilor cu un singur octet. |
C ++ | char*și char[], basic_string<>( stringsau wstring) | Șabloane C ++ definesc clase std::string(lanțuri de caractere bazate pe un octet). Cu toate acestea, este adesea necesară manipularea „șirurilor de tip C” pentru a putea utiliza biblioteca standard C ++ . |
C ++ 2011 | char*și char[], char16_t, char32_t, basic_string<>( stringsau wstring) | Evoluțiile C ++ 2011 fac posibilă luarea în considerare a tratamentului șirurilor de caractere Unicode. |
VS # | string, StringșiStringBuilder | șirul este un alias la șirul de clase (System.String), deci tastați șir nu se potrivește cu o referință (pointer). De asemenea, este posibil să utilizați char * și char [], dar aceasta implică utilizarea cuvântului cheie „nesigur”. StringBuilder este recomandat pentru cazurile în care codul concatenează mult. |
Pascal | String | Tipul de date șir a existat de mult timp în Pascal. Cu toate acestea, de la apariția Delphi , s-au adăugat mai multe tipuri de șiruri: AnsiString, UnicodeString și WideString. |
Obiectivul C | char * și NSString | NSString este folosit pentru a reprezenta un șir de caractere unicode imuabil. char * vă permite să gestionați un buffer de octeți. |
Javascript | var |
Cel puțin versiunile ECMAScript 3 și 5 declară în mod explicit un șir ca o colecție de numere întregi de 16 biți nesemnate care atunci când reprezintă text sunt unități ale codului UTF-16. |
Există diferite tehnici pentru reprezentarea șirurilor folosind octeți. În general, acestea necesită posibilitatea de a reprezenta fiecare caracter (codificare), dar și pentru a marca sfârșitul șirului.
Sfârșitul șirului poate fi cunoscut folosind un caracter de sfârșit de șir (de obicei 0, dar $ a fost folosit și în MS-DOS ) sau stocând simultan numărul de caractere sau numărul de octeți ai șirului.
Fiecare caracter este reprezentat de un număr de octeți care depinde de codificarea caracterelor . În funcție de codificarea utilizată, pot exista limite pentru setul de caractere disponibile, algoritmii pentru răsfoirea șirurilor, interoperabilitate și / sau performanță. În special, codificările bazate pe caractere cu un singur octet, cum ar fi ASCII extins, pot fi mai eficiente, dar limitative și / sau restrictive într-un context de internaționalizare și / sau interoperabilitate. Alte codificări, cum ar fi UTF-8 , au alte caracteristici.
Într-o memorie de computer , este cunoscută adresa de memorie a primului caracter. Pentru a delimita sfârșitul șirului, sau acesta s-a încheiat cu un caracter de terminare a șirului (zero binar în limbajul C , iar acest lucru este menționat la ASCIIZ pentru a indica „ terminat cu un z ero ”) sau numărul de caractere stocate în paralel ( BASIC , Pascal , PL / I ). În unele limbaje orientate obiect , codificarea internă a șirului nu trebuie cunoscută ( încapsulare ).
|
|
Secvența de evacuare poate fi , de asemenea , prezenți.
Personaj reprezentat | LA | m | e | l | eu | e | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
UTF16-BE NFC | 0041 | 006d | 00e9 | 006c | 0069 | 0065 | |||||||||||||||||
UTF16-BE NFD | 0041 | 006d | 0065 | 0301 | 006c | 0069 | 0065 | ||||||||||||||||
UTF16-BE NFD | LA | m | e | ' | l | eu | e |
De exemplu, tabelul [3] de mai jos descrie codificarea șirului 「日本語 版 Wikipedia」 (versiunea japoneză Wikipedia) cu convențiile ISO-2022-JP și Unicode.
Exemplu în ISO 2022Tabelul ilustrativ de exemplu este formatat după cum urmează:
Personaj reprezentat | 日 | 本 | 語 | 版 | W | eu | k | eu | p | e | d | eu | la | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
機能 区 点 行列 |
JIS X 0208 を 指示 |
38-92 | 43-60 | 24-76 | 40-39 | ASCII を 指示 |
07/05 | 06/09 | 06/11 | 06/09 | 07/00 | 05/06 | 04/06 | 06/09 | 06/01 | ||||||||
octet | 01/11 | 04/02 | 02/04 | 06/04 | 07/12 | 04/11 | 05/12 | 08/03 | 06/12 | 08/04 | 07/04 | 01/11 | 08/02 | 02/04 | 07/05 | 06/09 | 06/11 | 06/09 | 07/00 | 05/06 | 04/06 | 06/09 | 06/01 |
ESC | $ | B | F | | | K | \ | 8 | l | H | G | ESC | ( | B | W | eu | k | eu | p | e | d | eu | la |
Notă: este posibil ca prima secvență de evadare să nu fie necesară atunci când textul începe cu unul dintre cele 96 de caractere ale standardului american (ascii).
Exemplu UnicodeCodificarea șirului 「日本語 版 Wikipedia」 se poate face în unități pe 16 biți.
Personaj reprezentat | 日 | 本 | 語 | 版 | W | eu | k | eu | p | e | d | eu | la | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
UTF16-BE | 65e5 | 672c | 8a9e | 7248 | 0057 | 0069 | 006b | 0069 | 0070 | 0065 | 0064 | 0069 | 0061 |
Reprezentarea unui șir de caractere într-un limbaj de programare variază de la sistem la sistem.
Pentru a reprezenta un șir de caractere într-un flux de caractere (cum ar fi un fișier text , în special în codul sursă ), este în general necesar să marcați începutul și sfârșitul șirului și, opțional, să utilizați secvențe de evacuare .
De obicei, pentru a reprezenta un șir de caractere, este înconjurat de o pereche de caractere speciale, adesea ghilimele duble. De exemplu, „Wikipedia” va fi notat pentru a indica șirul format din cele nouă caractere W , i , k , i , p , é , d , i și a .
Exemple:
Pentru a putea folosi aceste caractere speciale, există convenții. Cu limbajul Pascal, dublăm ghilimela simplă pentru a o putea introduce în șirul de caractere:
Alte convenții folosesc un caracter de evadare; Backslash este cel mai de caractere utilizat. Pentru limbajele Java, C, C ++ (și altele), scriem \ "pentru a introduce un ghilimel dublu într-un șir de caractere:
Mulți algoritmi fac parte din stadiul tehnicii pentru procesarea șirurilor, fiecare dintre acestea putând avea forme diferite. Câteva exemple de categorii de astfel de algoritmi:
Considerarea adecvată a șirurilor de către dezvoltator necesită, în general, cunoașterea diferitelor utilizări ale personajelor. Operațiile care par evidente pe un alfabet de douăzeci și șase de caractere nu sunt neapărat evidente cu setul de caractere recunoscut de Unicode. Pentru o aplicație menită să fie distribuită la nivel global, acest lucru este îngreunat de posibilele specificități ale scrierii legate de anumite culturi: existența echivalenței de caractere, dimensiunea caracterelor asiatice, direcția de scriere, varianta scrisului pentru aceeași literă în funcție de cu privire la poziția sa, în special. În special, poate fi necesară specificarea unei operații la fel de simple ca numărarea caracterelor pentru a ști dacă ar trebui folosită pentru a număra unități de cod, puncte de cod sau grafeme.
Cu toate acestea, bibliotecile pentru anumite limbaje de programare fac posibilă satisfacerea parțială a acestor nevoi.
Anumite limitări ale anumitor limbaje de programare îi determină pe dezvoltatori să scrie bug-uri sau unii testeri să valideze funcționarea corectă numai pe o gamă limitată de caractere. În special, dezvoltatorii care vorbesc limba engleză au un obicei prost să efectueze doar o serie de teste limitate doar la caractere ASCII.