Meta
Deklarimi i kodimit (charset)
Deklarimi i kodimit të shenjave; pa të, shkronjat shqipe ë dhe ç shfaqen të prishura.
Çfarë është
<meta charset="utf-8"> i thotë shfletuesit se si t'i përkthejë bajtet e dokumentit në shkronja. Pa këtë deklarim shfletuesi merr me mend, zakonisht duke provuar një kodim të vjetër një-bajtësh.
Për tekstin anglisht gabimi është i padukshëm, sepse ASCII-ja përputhet. Për shqipen jo: ë, ç, Ë, Ç janë dy bajte në UTF-8 dhe të lexuara si një-bajtëshe kthehen në ë dhe ç.
Deklarimi duhet të rrijë brenda 1024 bajteve të parë të dokumentit, sepse shfletuesi vendos për kodimin para se të lexojë pjesën tjetër.
Pse ka rëndësi
Teksti i prishur e bën faqen të duket e braktisur, dhe vizitori largohet para se të lexojë çfarëdo. Në shqip kjo prek pothuajse çdo fjali.
Pasoja e dytë është e padukshme dhe më e rëndë: kur teksti lexohet gabim, çdo gjë e matur mbi të llogaritet gabim. Gjatësia e titullit, numri i fjalëve, dendësia e fjalëve kyçe dhe lexueshmëria maten mbi shkronja të shtrembëruara. Edhe motori i kërkimit e indekson faqen me ato shkronja — pra kërkimi për "çështje" nuk e gjen faqen që flet për çështje.
Të dhënat e formularëve vuajnë njësoj: emra dhe adresa të shkruara shqip ruhen të prishura në bazë dhe mbeten të tilla përgjithmonë.
Si rregullohet
Vendose si rreshtin e parë brenda <head>, para titullit:
<head>
<meta charset="utf-8">
<title>Çështje të hapura — Shembull</title>
</head>Hapat:
- Përdor UTF-8, jo ISO-8859-1 apo windows-1252. Këto të fundit nuk i mbajnë dot shkronjat shqipe.
- Ruaj skedarët vërtet në UTF-8, pa BOM. Deklarimi është premtim; nëse bajtet janë të një kodimi tjetër, premtimi gënjen.
- Shto edhe kokën HTTP, që ka përparësi ndaj etiketës: ``
Content-Type: text/html; charset=utf-8`` - Kontrollo bazën e të dhënave dhe lidhjen me të. Një tabelë
latin1i prish shkronjat pavarësisht se çfarë thotë HTML-ja. - Mos vendos asnjë bajt jo-ASCII para deklarimit — as në një koment, as në një shabllon.
Si e mat ky mjet
MetaAnalyzer::analyzeCharset() (services/MetaAnalyzer.php:156) lexon //meta[@charset]/@charset dhe, nëse nuk e gjen, bie te //meta[@http-equiv="Content-Type"]/@content duke nxjerrë charset= me shprehje të rregullt. Tri dalje: mungon (:171, paralajmërim), ekziston por nuk është utf-8 (:173, informativ), është utf-8 (kaluar pa konstatim).
Çfarë NUK e mat
Kontrolli e sheh deklarimin, jo bajtet. Nuk verifikon nëse dokumenti është vërtet i koduar ashtu si thotë, dhe nuk kontrollon nëse deklarimi rri brenda 1024 bajteve të parë.
Ekziston edhe një kurth më i thellë, i matur dhe i regjistruar: kur bajtet jo-ASCII vijnë para etiketës <meta charset>, biblioteka që analizon HTML-në e vendos kodimin nga ato bajte dhe e shpërfill etiketën që vjen më pas. Roja në services/SeoAnalyzer.php:622 e sheh etiketën dhe prandaj nuk e shton kokën shpëtimtare — pikërisht në rastin ku do të duhej. Rezultati: gjithë analiza e tekstit të asaj faqeje bëhet mbi shkronja të prishura, dhe as ky kontroll nuk e raporton. Detajet te MASTER_PLAN/audits/61-ANALIZUESIT-INVENTAR.md §4.6.
Mospërputhje midis tekstit të analizuesit dhe matjes
| Teksti i analizuesit | Çfarë ndodh | Si u mat | Burimi |
|---|---|---|---|
| (asnjë konstatim — dështimi është i heshtur) | Roja e sheh etiketën dhe nuk e shton kokën shpëtimtare, pikërisht në rastin ku ajo duhej. | Mbi 31-charset-pas-shenjave-joascii.html: 'Përshëndetje — çështje kodimi' u lexua si mojibake; gjatësia e titullit, numri i fjalëve dhe lexueshmëria u matën mbi tekstin e shtrembëruar. — MASTER_PLAN/audits/61-ANALIZUESIT-INVENTAR.md §4.6 | services/SeoAnalyzer.php:622 |
Kodi që e kryen matjen
services/MetaAnalyzer.php:156— MetaAnalyzer::analyzeCharsetservices/SeoAnalyzer.php:622— SeoAnalyzer::parseHtml