Kodiranje karaktera u HTML-u

Из Википедије, слободне енциклопедије

HTML (Hypertext Markup Language) se koristi od 1991, ali HTML 4.0 (decembar 1997) je bio prva standardizovana verzija gde su međunarodni karakteri dobili skoro kompletan tretman. Kada neki HTML dokument uključuje specijalne karaktere van domena sedmobitnog ASCII-a dva cilja su vredna razmatranja: integritet informacija, i jedinstven prikaz u pretraživačima.

Navođenje kodiranja karaktera u dokumentu[уреди]

Postoji više načina da se navede kodiranje karaktera koje se koristi u dokumentu. Prvo, web server može da uključi kodiranje karaktera ili “charset” u hederu Hypertext Transfer Protokola (HTTP), što obično izgleda ovako:[1]

Content-Type: text/html; charset=ISO-8859-1

Ovaj metod daje pogodan način HTTP serveru da menja kodiranje karaktera u dokumentu prema sadržaju. Neki HTTP server softver može to da uradi, na primer Apache sa modulom mod_charset_lite.[2]

U HTML-u moguće je uključiti ovu informaciju unutar head elementa pri vrhu dokumenta:[3]

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

HTML5 takođe dozvoljava skraćenu sintaksu sa istim značenjem:[3]

<meta charset="utf-8">

XHTML dokumenti imaju treću mogućnost: da izraze kodiranje karaktera preko XML deklaracije:[4]

<?xml version="1.0" encoding="ISO-8859-1"?>

<meta http-equiv="Content-Type"> može biti interpretiran direktno od strane pretraživača kao običan HTML selektor, ili može biti iskorišćen od strane HTTP servera da bi se generisao odgovarajući heder kada služi dokument.[5] HTTP/1.1 heder specifikacija za HTML dokument mora navesti odgovarajuće kodiranje u Content-Type hederu,[6] izostavljanje charset= parametra dovodi do prihvatanja ISO-8859-1 (pa HTTP/1.1 ne nudi takvu takvu opciju kao što je neodredjeno kodiranje karaktera), i ova sprecifikacija zamenjuje sve HTML (or XHTML) u meta elementima. To može da predstavlja problem ako server generiše pogrešan heder i korisnik nema pristup ili znanje da ga promeni.

Kako svaki od ovih načina govori primaocu kako treba tumačiti poslati fajl, ne bi bilo prikladno da ove deklaracije ne odgovaraju kodiranju karaktera koje je korišćeno. Pošto server obično ne zna kako je dokument kodiran, pogotovu ako su dokumenti kreirani na različitim platformama ili u različitim regijama, mnogi serveri jednostavno ne uključuju referencu na "charset" u Content-Type hederu, čime izbegavaju davanje lažnih obećanja. Medjutim ako dokument ne navede kodiranje to može dovesti do podjednako loše situacije gde pretraživač prikazuje mojibake jer ne može da pronadje koje je kodiranje karaktera korišćeno. Zbog rasprostranjenog i upornog ignorisanja charset= na Internetu (na serverskoj strani), konzorcijum se u HTTP/1.1 odrekao strogog pristupa[7] i podstiče proizvodjače pretraživača da koriste neke ispravke u suprotnosti sa RFC 2616.

Ako pretraživač pročita dokument bez navedenog kodiranja karaktera, može da koristi neke druge informacije. Na primer, može se osloniti na podešavanja korisnika, bilo za ceo pretraživač ili za dati dokument, ili može izabrati podrazumevano kodiranje u zavisnosti od jezika korisnika. Za zapadnoevropske jezike, uobičajeno je i prilično sigurno da se pretpostavi Windows-1252, sa ISO-8859-1 ali ima karaktere koji se mogu štampati na mestu nekih kontrolnih karaktera. Posledica izbora pogrešnog kodiranja je da se karakteri van ASCII(32-126) opsega koji se mogu štampati obično prikazuju nepravilno. Ovo predstavlja nekoliko problema za korisnike sa engleskog govornog područja, ali u drugim jezicima redovno-u nekim slučajevima uvek zahtevaju znakove van tog opsega. U CJK sredinama gde postoji više različitih višebajtnih kodiranja u upotrebi autodetekcija se često koristi. Konačno, pretraživači obično dozvoljavaju korisnicima da prevazidju pogrešna kodiranja karaktera i ručno.

Sve je učestalije za višejezičke veb sajtove i veb sajtove na ne zapadno-evropskim jezicima da koriste UTF-8, koji dozvoljava korišćenje istog kodiranja za sve jezike. UTF-16 ili UTF-32, koji se takodje mogu koristiti za sve jezike, se redje koriste zato što je teže rukovati im u programskim jezicima koji pretpostavljaju bajt-orijentisano ASCII kodiranje, i manje su efikasni u tekstovima sa velikom učestalosti ASCII karaktera, što je obično slučaj u HTML dokumentima.

Pravilno prikazivanje stranice nije nužno pokazatelj da je kodiranje pravilno navedeno. Ako tvorac stranice i čitalac oboje pretpostavljaju neko kodiranje zavisno od platforme, i server ne šalje bilo kakve podatke za identifikaciju, onda će čitalac ipak videti stranicu kako je tvorac zamislio, ali drugi čitaoci na različitim platformama ili sa različitim maternjim jezicima neće videti stranicu kako je zamišljeno.

Karakterske reference[уреди]

Pored izvornog kodiranja karaktera, karakteri se mogu kodirati kao karakterske reference, koje mogu biti numeričke karakterske reference(decimalne ili heksadecimalne) ili karakterski entiteti. Karakterski entiteti se nekad nazivaju i imenovani entiteti, ili HTML entiteti za HTML. Korišćenje karakterskih entiteta u HTML-u potiče iz SGML.

HTML karakterske reference[уреди]

Numeričke karakterske reference u HTML-u odnose se na karakter prema njegovom UCS/Unicode koda i koristi format:

&#nnnn;

ili

&#xhhhh;

gde je nnnn kod u decimalnoj formi, i hhhh je kod u heksadecimalnoj formi. Znak x mora biti malo slovo u XML dokumentima. Karakteri nnnn ili hhhh mogu biti bilo koji brojevi i mogu da uključuju vodeće nule, dok hhhh može da meša mala i velika slova, ali se uobičajeno koriste velika slova.

Neće svi web browser ili imejl klijent koje koriste primaoci HTML documents, ili uređivači teksta korišćeni od strane kreatora HTML dokumenta biti sposobni da prikažu sve HTML karaktere. Većina novijeg softvera može da prikaže skoro sve karaktere za jezik korisnika, i prikazaće kvadratić ili neki drugi indikator za karaktere koje ne može da prikaže.

Za kodove iz opsega od 0 do 127 originalnog ASCII 7-bitnog skupa, većina karaktera se može koristiti bez karakterske reference. Kodovi iz opsega od 160 do 255 se svi mogu kreirati koristeči karakterske entitete. Samo nekolicina kodova visokog broja se mogu kreirati koristeći entitete, ali se svi mogu kreirati koristeći decimalne karakterske reference.

Karakterski entiteti mogu takodje imati format &ime; gde je ime alfanumerička niska gde se razlikuju mala i velika slova. Na primer, "λ" se može takodje kodirati sa &lambda; u HTML dokumentu. Karakterski entiteti &lt;, &gt;, &quot; i &amp; su predefinisani u HTML-u i SGML-u, jer se <, >, " i & već koriste za ograničavanje naznaka. Ovo ne uključuje XML-ov &apos; (') entitet.

Nepotrebno korišćenje HTML karakterskih referenci može značajno da smanji čitljivost HTML koda. Ako se kodiranje karaktera za veb stranicu izabere pravilno, onda su HMTL karakterske reference potrebne samo za ograničavanje naznaka kao sto je rečeno iznad, i za nekolicinu specijalnih karaktera(ili nimalo ako se koristi nativno Unicode kodiranje kao što je UTF-8). Korišćenje pogrešnog entiteta može napraviti probleme sa sigurnošću za 'injection' napade kao što je http://en.wikipedia.org/wiki/Cross-site_scripting. Ako su HTML atributi ostavljenji bez navodnika, pojedini karakteri, najvažnije beline, kao što su razmak ili tabulator moraju da koriste entitete. Drugi jezici srodni HTML-u imaju svoje načine ubacivanja specijalnih karaktera.

Ilegalni karakteri[уреди]

HTML zabranjuje korišćenje karaktera sa[8] the use of the characters with UCS/Unicodekodovima.

  • 0 do 31, sem 9, 10, i 13 (C0 kontrolni karakteri)
  • 127 (DEL character)
  • 128 do 159 (x80 – x9F, C1 kontrolni karakteri)
  • 55296 do 57343 (xD800 – xDFFF)

Unicode standard takodje zabranjuje:

  • 65534 i 65535 (xFFFE – xFFFF), ne-karakteri, vezani za xFEFF.

Ovi znakovi nisu dozvoljeni ni po referenci. Tako da ih ne treba ni pisati kao numeričke karakterske reference. Medjutim reference na karaktere 128-159 su obično tumačene od veb pregledača kao da su reference na karaktere dodeljene bajtovima 128-159(decimalni) u Windows-1252 kodiranju karaktera. Ovo je u suprotnosti sa HTML i SGML standardima, i karakteri su već dodeljeni višim kodovima, pa kreatori HTML dokumenata uvek treba da koriste više kodove. Na primer za zaštitni znak (™), treba koristiti &#8482;, a ne &#153;.

Karakteri 9 (tab), 10 (linefeed) i 13 (carriage return) su dozvoljeni u HTML dokumentima ali zajedno sa 32 (space) se smatraju belinama.[9] Kontrolni karakter  "form feed"  koji bi trebao biti 12, nije dozvoljen u HTML dokumentima ali se takodje pominje kao jedan od karaktera koji se smatraju belinama. U HTML-u većina uzastopnih pojavljivanja belina, osim <pre> bloka, se interpretira kao jedan razmak za potrebe prikaza. Razmak se obično prikazuje kao razmak en-širine u evropskim jezicima, ali ne i u svim ostalim.

XML karakterske reference[уреди]

Za razliku od tradicionalnog HTML-a sa svojim širokim opsegom karakterskih entiteta, u XML postoji samo pet predefinisanih karakterskih entiteta. Oni se koriste za ubacivanje karaktera koji su osetljivi na označavanje u odredjenom kontekstu:[10]

  • &amp; → & (ampersend, U+0026)
  • &lt; → < (manje od, U+003C)
  • &gt; → > (veće od, U+003E)
  • &quot; → " (navodnik, U+0022)
  • &apos; → ' (apostrof, U+0027)

Svi drugi karakterski entiteti moraju biti definisani pre nego što se mogu koristiti. Na primer, korišćenje &eacute; (wkoji daje é, latinično malo E sa oštrim akcentom, U+00E9 u Unicode-u) u XML dokumentu će generisati grešku ukoliko entitet nije već definisan. XML takodje zahteva da x u heksadekadnim numeričkim referencama bude malo slovo: na primer &#xA1b umesto &#XA1b. XHTML, koji je XML aplikacija, podržava set HTML entiteta, zajedno sa predefinisanim entitetima XML-a.

Medjutim korišćenje &apos; u XHTML-u generalno treba izbegavati zbog kompatibilnosti. Umesto toga mogu se koristiti &#39; or &#x0027;.

&amp; ima poseban problem da počinje sa karakterom koji treba posebno ubaciti. Jednostavna internet pretraga pronalazi milione nizova &amp;amp;amp;amp; ...u HTML stranama za koje algoritam za zamenu ampersenda sa odgovarajućim entitetom se verovatno primenjuje ponavljajući .

Reference[уреди]

  1. ^ Fielding, R.; Gettys, J.; Mogul, J.; Frystyk, H.; Masinter, L.; Leach, P.; Berners-Lee, T. (June 1999), „Content-Type“, Hypertext Transfer Protocol – HTTP/1.1, IETF, приступљено 8. 3. 2010. 
  2. ^ Apache Module mod_charset_lite
  3. ^ а б Hickson, I. (5. 3. 2010.), „Specifying the document's character encoding“, HTML5, WHATWG, приступљено 8. 3. 2010. 
  4. ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yergeau, F. (26 November 2008), „Prolog and Document Type Declaration“, XML, W3C, приступљено 8. 3. 2010. 
  5. ^ The global structure of an HTML document: The META element
  6. ^ RFC 2616 3.7.1 Canonicalization and Text Defaults
  7. ^ HTML 4, HTML Document Representation: Specifying the character encoding
  8. ^ SGML Declaration of HTML 4
  9. ^ Paragraphs, Lines, and Phrases
  10. ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yergeau, F. (26 November 2008), „Character and Entity References“, XML, W3C, приступљено 8. 3. 2010. 

Spoljašnje veze[уреди]