Marcator de secvență de octeți

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 16 aprilie 2021; verificările necesită 4 modificări .

Marcatorul secvenței de octeți sau marcatorul de ordine a octeților ( English  Byte Order Mark, BOM ) este un caracter special din standardul Unicode inserat la începutul unui fișier text sau al unui flux pentru a indica faptul că Unicode este utilizat în fișier (flux), precum și pentru a indică indirect codificarea și ordinea octeților prin care au fost codificate caracterele Unicode. Numărul Unicode pentru acest caracter este U+FEFF. Utilizarea acestui caracter, conform specificației Unicode, este opțională, dar este utilizat pe scară largă, deoarece facilitează evitarea decodării incorecte a informațiilor textuale.

Utilizare

Conform specificației Unicode, un marcator poate apărea doar la începutul unui fișier sau flux. Dacă un caracter U+FEFFapare în mijlocul unui flux de date, trebuie să fie interpretat ca un „spațiu fără lățime zero” (în esență, un caracter care nu poate fi afișat și care nu se schimbă). Cu toate acestea, majoritatea[ cât? ], altele decât versiunile Opera 12 și mai mici, tratează BOM-ul din mijlocul documentului ca pe un caracter care ocupă o linie întreagă și apoi generează o întrerupere de linie [1] .

Pentru un spațiu de lățime zero fără rupere în Unicode, există, de asemenea, un caracter special separat - U+2060, care este recomandat să fie utilizat ca atare, iar marcatorul de secvență de octeți este U+FEFFrecomandat să fie utilizat numai în scopul propus.

Dacă formatul de reprezentare a caracterelor Unicode este cunoscut exact în prealabil de către programul de recepție, atunci conform standardului Unicode, marcatorul nu trebuie setat. Și dacă formatul este declarat în alt mod (de exemplu, MIME în câmpul antet Content-Type), marcatorul nu trebuie să fie setat conform standardului.

Determinarea codificării prin marker de secvență de octeți

Prin modul în care este codificat marcatorul secvenței de octeți de la începutul unui fișier sau flux, se poate determina cu ușurință codarea și ordinea octeților utilizate pentru a codifica caracterele Unicode în acel fișier sau flux. Această împrejurare a fost principalul motiv pentru utilizarea pe scară largă a marcatorului de secvență de octeți.

Codificare Reprezentarea marcatorului secvenței de octeți Reprezentarea markerului în caz de decodificare eronată cu o codificare diferită
Cod hexadecimal Cod zecimal ISO-8859-1 KOI8-R CP1251 CP866 cometariu
UTF-8 [t1] EF BB BF 239 187 191  О╩© п»ї я╗┐
UTF-16 ( BE ) FE FF 254 255 þÿ ЧЪ юя ■  decalaj - nerupere
UTF-16 ( LE ) FF FE 255 254 ÿþ ЪЧ яю  ■
UTF-32 (BE) 00 00 FE FF 0 0 254 255 ␀␀þÿ ␀␀ЧЪ ␀␀юя ␀␀■  ␀ - NUL , spatiu - nerupere
UTF-32 (LE) FF FE 00 00 255 254 0 0 ÿþ␀␀ ЪЧ␀␀ яю␀␀  ■␀␀
UTF-7 [t1] 2B 2F 76 38
2B 2F 76 39
2B 2F 76 2B
2B 2F 76 2F[t2]
43 47 118 56
43 47 118 57
43 47 118 43
43 47 118 47
+/v8
+/v9
+/v+
+/v/
UTF-1 [t1] F7 64 4C 247 100 76 ÷dL
UTF-EBCDIC [t 1] DD 73 66 73 221 115 102 115 Ýsfs
SCSU [t1] 0E FE FF[t3] 14 254 255 ␎þÿ ␎■  ␎ - ex. Simbol Shift Out, spațiul nu se rupe
BOCU-1 [t1] FB EE 28 251 238 40 ûî √ю(
GB-18030 [t1] 84 31 95 33 132 49 149 51 �1�3 Д1Х3 � — coduri fără valori
  1. 1 2 3 4 5 6 7 În aceste codificări, secvența nu determină exact ordinea octetilor , deoarece codificarea este de un octet, dar această secvență poate fi folosită pentru a determina metoda de codificare. [2] [3]
  2. În UTF-7, datorită utilizării bazei-64, al patrulea octet al BOM este 001111xxîn reprezentare binară, unde xxdepinde de următorul caracter (primul după BOM). Prin urmare, al patrulea octet nu face doar parte din BOM, ci conține și informații despre următorul caracter (non-BOM). Pentru xx=00, 01, 10, 11, al patrulea octet va fi respectiv , 38, 39, 2Bsau 2Fcând este codificat în base64. Dacă următorul caracter nu este codificat în bază64, atunci este folosit 38ca al patrulea octet, iar următorul octet este 2D.
  3. SCSU oferă alte codificări pentru U+FEFF, secvența specificată este recomandată în UTR #6. [patru]

Dificultăți de luat în considerare atunci când utilizați

Există cazuri în care utilizarea unui marcator de secvență de octeți ar trebui evitată în ciuda confortului său. De exemplu, utilizarea unui marcator în șabloanele web face ca în document să apară linii goale, așa că este o idee bună să eliminați marcatorul din scripturile web și fișierele CSS . Iar prezența unui marker la începutul fișierelor PHP (înaintea etichetei <?php) face ca un șir gol să fie trimis către client înainte ca codul să înceapă chiar să se execute, ceea ce provoacă un eșec în cazurile în care un antet HTTP ar trebui trimis imediat către clientul (la redirecționarea unei cereri, de exemplu). [5] De asemenea, poate procesa incorect json_decode dacă json este scris într-un fișier cu BOM.

Note

  1. Marca de ordine a octetilor (BOM) în HTML  . www.w3.org. Preluat la 19 septembrie 2018. Arhivat din original la 17 august 2018.
  2. Întrebări frecvente - UTF-8, UTF-16, UTF-32 & BOM: Un flux de date UTF-8 poate conține caracterul BOM (în formă UTF-8)? Dacă da, pot să presupun că rămașii octeți UTF-8 sunt în ordinea big-endian? . Consultat la 4 ianuarie 2009. Arhivat din original la 1 septembrie 2012.
  3. STD 63: UTF-8, o transformare a ISO 10646 Arhivat 25 octombrie 2011 la Wayback Machine Byte Order Mark (BOM)
  4. UTR #6: Secvență de octeți de semnătură pentru SCSU . Consultat la 18 octombrie 2011. Arhivat din original pe 6 octombrie 2011.
  5. Probleme potențiale cu BOM-ul UTF-8 . Preluat la 3 mai 2017. Arhivat din original la 13 iunie 2017.