Normaal gebruik ik altijd de HTML5 <meta charset="utf-8"/> tag om een pagina te declareren.
Maar soms zie ik mensen de charset van een pagina opgeven met PHP:
header('Content-Type: text/html; charset=UTF-8');
Ik vroeg me af wat de juiste manier is en of je ze beide kan/moet gebruiken?
Ik kan hier weinig/onduidelijke informatie over vinden op het internet.
Allebei kan, zelfs gecombineerd. Het is alleen een beetje suf als je het alleen in het document declareert, omdat applicaties (zoals browsers) die het document aan het interpreteren zijn dan mogelijk het document opnieuw gaan uitlezen omdat er dan pas geconstateerd wordt dat het content-type / de character encoding afwijkt van de veronderstelde default. Hiervoor is een (PHP) header handig(er): je kondigt vantevoren aan welke content (en met welke encoding) eraan komt.
Het belangrijkste is dat de verschillende opties om encoding aan te geven elkaar in ieder geval niet tegenspreken.
Via een HTTP header is het mooist, omdat je dan al voor de HTML te serveren hebt aangegeven in welke encoding het komt. De browser hoeft er dan niet twee keer over na te denken.
Een BOM is minder duidelijk, maar kan een pré zijn bij het opslaan van de HTML. Al gaat een BOM gemakkelijk verloren in een tekst-editor, en slaan browsers toch aanvullende informatie op om de hele HTML-pagina zo goed mogelijk te behouden.
Om het voor mensen leesbaar te houden kan je het beste de HTML5 charset of metatag gebruiken om de encoding in stand te houden.
Een eindgebruiker zal geen verschil merken. Tenzij de encoding niet klopt.
Via een HTTP header is het mooist, omdat je dan al voor de HTML te serveren hebt aangegeven in welke encoding het komt. De browser hoeft er dan niet twee keer over na te denken.
Om het voor mensen leesbaar te houden kan je het beste de HTML5 charset of metatag gebruiken om de encoding in stand te houden.
Wat vind jij dan belangrijker? een mooiere HTTP header voor de HTML of een leesbare HTML5 metatag?
Een metatag kan genegeerd worden. Het belangrijkste is ondubbelzinnigheid. "leesbaar" is niet van toepassing omdat mensen niet via de broncode een webpagina bekijken (behalve wellicht uit nieuwsgierigheid om te zien hoe een pagina is opgebouwd). Als je voor een van de twee wilt kiezen, gebruiken dan header().
En niet alleen voor je HTML, ook als je nav AJAX-requests JSON-responses serveert is het belangrijk om je content-type en character encoding aan te geven:
Wat ik al zei, een eindgebruiker zal het verschil niet zien. En ach, ook een HTTP-header is vrij leesbaar in de debugging-tools van de browser. Conclusie: het is lood om oud ijzer. Het maakt niet uit. Misschien beter mee verlegen dan om verlegen, en dan doe je alles, HTTP header, tags, etc.