Hallo

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.

Alvast bedankt!
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.

Daarnaast, als je dit doet:
<!DOCTYPE html>
<html>
<head>
<title>woops</title>
<meta charset="UTF-8">
...

Dan ben je al nat als je title UTF-8 encoded data bevat, deze wordt dan mogelijk niet goed geïnterpreteerd.

Als je dan toch een meta-tag gebruikt, zorg dan op zijn minst dat dit de eerste tag na je <head> tag is.

Maar je zou dus ook prima kunnen volstaan met enkel een header(), en de meta-tag geheel achterwege laten.
http://stackoverflow.com/questions/11820006/php-html5-utf-8-document-declaration-with-meta-tag-or-through-the-header

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.
Bedankt voor jullie antwoorden!

An tje op 22/05/2015 16:16:54

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?

En wat gebruiken jullie altijd?
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:
<?php
header('Content-Type: application/json; charset=UTF-8');
echo json_encode(array(
    'a' => 'bla',
    'b' => 'whatever',
));
?>

Als je dit niet doet kunnen er rare dingen gebeuren, je hebt vast wel eens ? karakters gezien in de activiteiten-feed op de voorpagina :).

Dit issue is trouwens nog steeds niet gerepareerd.
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.

Reageren