Använd accesskey 'n' för att hoppa till de interna navigationslänkarna i dokumentet. Hoppa till början av innehållet.

Detta dokument är en översättning av ett engelskt orginal. Om det finns tveksamheter eller fel i detta dokument, så är senaste version av det engelska orginalet den auktoritativa versionen. Copyright tillhör W3C, enligt nedan.

Översättare: Olle Olsson, SICS

s_gotoW3cHome Internationalization
 

Deklarera teckenkodning i HTML

Avsedd läsarkrets: XHTML/HTML-kodare (med editorer eller skripts), skriptutvecklare (PHP, JSP, etc.), CSS-kodare, projektledare för webbprojekt, och alla som behöver en introduktion om hur man deklarerar teckenkodning för sin (X)HTML- eller CSS-fil.

Obs: Det engelska originaldokumentet har ändrats sedan det översattes. Se ändringsloggen.

Frågor

Hur bör jag deklarera kodningen av min HTML-fil?

Bakgrundsinformation

Du bör alltid ange vilken kodning som används för en HTML eller XML-sida. Om du inte gör det så riskerar du att tecken i ditt innehåll inte tolkas på rätt sätt. Det handlar inte bara om hur människan läser innehåll, eftersom det blir alltmer vanligt att maskiner behöver förstå din data. Du bör även kontrollera att du inte samtidigt specificerar olika kodningar med några olika metoder, för samma dokument.

Denna artikel ger enkla råd om hur man skapar de behövliga deklarationerna. Råden ges på två former:

  1. enkla råd som fungerar för de som snabbt vill få information om hur de skall göra
  2. utförligare information för de som vill få bättre förståelse om detta problemområde eller vill prova alternativa ansatser. Här förutsätts ändå att du först tar del av de enkla råden.

Om du behöver få en bättre förståelse av vad tecken och teckenkodningar är, läs då artikeln Character encodings for beginners. Mer information om hur man deklarerar kodning av CSS-formatmallar finns i artikeln CSS character encoding declarations.

Snabbt svar

Här ger vi en snabb översikt för de som bara vill veta vad de skall göra, med endast minimala förklaringar. Utför dessa steg:

  1. Fatta beslut om du skall använda HTTP-huvud
  2. Se vad som står i tabellen i Deklarationer i dokument för det format du använder.
  3. Läs om namn på teckenkodningar

Om du inte riktigt förstår detta kortfattade råd, eller om du vill förstå underliggande motiv, så kan du följa länkarna i dem till de sektioner längre ned i sidan, där exempel och förklaringar finns.

HTTP-huvud

Du bör absolut använda deklarationer i HTTP-huvudet (engelska: "HTTP headers") om dokumentet kan bli omkodat (dvs teckenkodningen kan ändras av intermediära servers), eftersom HTTP-deklarationer har högre prioritet än deklarationer i dokument.

Annars bör du använda HTTP-huvud, om det är meningsfullt, för alla typer av innehåll, men parat med en deklaration i dokumentet (se nedan). Du ska alltid försäkra dig om att HTTP-deklarationer är konsistenta med deklarationer i dokument.

Om din sida kodas som UTF-16, så ska du inte deklarera din fil som "UTF-16BE" eller "UTF-16LE" – använd bara "UTF-16", och skicka ett byteordningsmärke med din fil.

Deklarationer i dokument

I alla exempel nedan så bör du (om inget annat sägs) sätta in det korrekta namnet på din valda teckenkodning istället för "UTF-8".

Format Gör så här
HTML5

Använd charset-attributet i ett metaelement i början av head-elementet, och försäkra dig om att hela deklarationen får rum inom de första 1024 bytes av sidan.

<meta charset="UTF-8">

HTML5 med UTF-16

Försäkra dig om att det finns ett byteordningsmärke i början av filen.

Arbetsgruppen för HTML diskuterar för närvarande om man kan använda en deklaration i ett meta-element inom head-elementet när kodningen är UTF-16. I dagens läge bör du inte använda sådana deklarationer.

HTML4

Använd ett pragmadirektiv i början av head-elementet.

<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
XHTML 1.x levererad med MIME-typ text/html

Använd UTF-8 som kodning av sidan, och använd ett pragmadirektiv i början av head-elementet.

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

(Om du vill använda någon annan kodning av innehållet, läs då den utförliga beskrivningen nedan)

XHTML 1.x levererad som XML

Använd encoding-deklarationen i XML-deklarationen på sidans första rad. Försäkra dig om att det inte finns något före denna rad, inte ens blanktecken (men ett byteordningsmärke får finnas där).

<?xml version="1.0" encoding="UTF-8"?>

Namn på teckenkodningar

Du kan hitta namn på teckenkodningar i IANA-registret. Du bör använda dessa namn för alla de olika metoder nedan som visar hur man anger teckenkodning. Lägg märke till att fastän dessa kallas charset-namn av IANA, så är de egentligen namn på kodningar, inte på teckenuppsättningar.

IANA-registret ger ofta flera namn på samma kodning. I så fall bör du använda det namn som markeras som 'preferred'.

Det är möjligt att hitta på egna namn på kodningar genom att inleda dem med x-, men detta kan inte rekommenderas, eftersom det begränsar interoperabilitet.

Lägg märke till att det finns ett bindestreck i namnet UTF-8.

Alternativa ansatser

Det finns ett antal alternativ till de ansatser som rekommenderades ovan, men för sådana alternativ finns både fördelar och nackdelar. Mer information får du genom att följa angivna länkar.

Utförligare information

Här ger vi mer utförlig information om de olika möjliga sätten att deklarera information om teckenkodning – först om att använda HTTP-huvudet, och sedan om de olika sätten att deklarera i dokument som inte är kodade i UTF-16. Det finns en särskild undersektion som handlar om sidor kodade i UTF-16.

Denna sektion innehåller:

HTTP-huvud

Information om Content-Type i ett HTTP-huvud kan innehålla information om teckenkodning av dokumentet.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
...
Content-Type: text/html; charset=UTF-8
Content-Language: en

Kodning kan anges i ett HTTP-huvud för filer som innehåller sådant som CSS och JavaScript, inte bara HTML-uppmärkning.

Om ditt dokument skapas dynamiskt med skripts så kan du explicit lägga till denna information i HTTP-huvudet. Till exempel kan du i PHP använda funktionen header() innan du genererar det verkliga innehållet, på följande sätt:

<?php header('Content-type: text/html; charset=utf-8'); ?>
<!DOCTYPE html>
...

Om du levererar statiska filer så kan servern knyta kodningsinformation till filerna. Sättet att anpassa en server så att den levererar information om teckenkodning beror på vilken typ av server som används. Du bör kontakta administratören av servern om detta.

Till exempel erbjuder Apache-servers en standardkodning, men användarens inställningar kan ersätta standardvärden. En användare kan exempelvis lägga till följande rad i filen .htaccess för att leverera alla filer med filnamnssuffix ".html", i detta och alla underliggande filkataloger, som UTF-8:

AddType 'text/html; charset=UTF-8' html

Mer information om hur man kan ändra kodning i HTTP-huvuden finns i Setting the HTTP charset parameter.

Här är några synpunkter på om det är lämpligt att deklarera kodning i HTTP-huvudet, i en sida, eller på båda sätten

Fördelar

Nackdelar

Bör jag använda denna metod?

Om man levererar filer via HTTP från en server så är det aldrig något problem att skicka med teckenkodningsinformation i HTTP-huvudet, så länge som denna information är korrekt.

Om du tror att det finns en risk att kodningen av en fil kan ändras av en intermediär server innan den kommer fram till en användare (t.ex. omkodad till en kodning som en mobiltelefon kan hantera), så bör du verkligen använda HTTP-deklarationen, eftersom det är där som ändringen kommer att ske.

Å andra sidan, orsakat av de nackdelar vi angivit ovan, så rekommenderar vi att du alltid bör deklarera kodningsinformation även i dokumentet självt.

(Vissa argumenterar för att det sällan är lämpligt att deklarera kodning i HTTP-huvuden om du ändå gör samma deklaration i dokumentets innehåll. I detta fall föreslår de att HTTP-huvudet inte skall uttrycka någon information om dokumentets kodning. Observera att detta vanligtvis betyder att man måste vidtaga åtgärder för att inaktivera serverns standardinställningar.)

Charset-attributet i metaelement

Specifikationen för HTML5 beskriver ett sätt att deklarera kodningen av ett dokument, ett sätt som redan stöds av de brett använda webbläsarna. Du kan använda detta för sidor formulerade med HTML5-uppmärkning. Alternativt kan du använda pragmadirektivet, men du bör inte använda båda sätten i samma sida.

Om du använder denna deklaration i HTML4-sidor så kommer HTML4-valideraren att klaga (men webbläsaren kommer ändå att hitta informationen).

Deklarationen ser ut som följer.

<meta charset="UTF-8">

HTML5-specifikationen kräver att hela metaelementet ryms inom de första 1024 bytes av dokumentet, så det är bäst att placera den i början av head-elementet.

Formellt sett behöver du inte ha en explicit deklaration om du använder UTF-8, men det är ändå lämpligt att göra det, eftersom kodningen då blir synlig vid visuell inspektion av källkoden. Det kan även ge bättre stöd i äldre webbläsare och i författarverktyg.

Om du kodar din sida i UTF-16, läs då Att använda UTF-16.

Pragmadirektivet

Detta är ett metaelement som bör finnas så nära början av head-elementet som möjligt, och det ser ut som följer:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
För XHTML-syntax ska du naturligtvis avsluta den med " />" efter content-attributet, och inte med enbart ">".

Kodningen av dokumentet anges alldeles efter charset=. I detta exempel är det en Unicode-kodning, UTF-8.

Pragmadirektivet bör användas för sidor skrivna i HTML 4.01. Det bör även användas för XHTML 1.x-dokument som levereras som HTML, eftersom HTML-parsern inte kommer att använda kodningsinformationen angiven i XML-deklarationen.

I HTML5 kan du antingen använda denna teknik för att deklarera kodning, eller det nyligen specificerade charset-attributet i metaelement, men använd inte bägge i samma sida. Kodningsdeklarationen bör rymmas inom de första 1024 bytes av dokumentet, så du bör placera det omedelbart efter starttaggen för head-elementet.

Om kodningen deklareras i dokumentet på detta sätt så kan dokumentet läsas korrekt även när det inte hämtas från en server. Detta gäller inte bara statiska dokument som läses från disk eller från en CD, utan även dynamiska dokument som sparas av webbläsaren.

En deklaration i dokumentet är också nyttig för utvecklare, testare och översättare som vill visuellt avgöra kodningen av dokumentet.

Om du kodar din sida i UTF-16, läs då Att använda UTF-16.

XML-deklarationen

XML-deklarationen definieras av XML-standarden. Den finns i början av XML-filen, och stöder en encoding-deklaration. Ett exempel:

<?xml version="1.0" encoding="UTF-8"?>

En XML-deklaration krävs för dokumentet som parsas som XML, om kodningen inte är en av UTF-8 eller UTF-16, och om kodning inte anges av ett protokoll på högre nivå, dvs via HTTP-huvud.

Detta är viktigt, eftersom om du väljer att inte använda XML-deklarationen så måste du välja UTF-8 eller UTF-16 som kodning för sidan, om den ska åtkommas utan användning av HTTP!

Du bör använda en XML-deklaration för att ange kodning av XHTML 1.x-dokument som levereras som XML.

Det kan vara bra att använda en XML-deklaration för webbsidor som levereras som XML, även om kodningen är UTF-8 eller UTF-16, eftersom en sådan deklaration i dokumentet kan vara nyttigt för utvecklare, testare eller översättare, som då kan avgöra kodningen genom en visuell inspektion av källkoden.

Att använda XML-deklarationen för XHTML levererad som HTML. XHTML som levereras som HTML kommer att parsas som HTML, trots att den bygger på XML-syntax, och alltså kommer XML-deklarationen inte att användas av webbläsaren. Det är av detta skäl som du bör använda ett pragmadirektiv för att ange kodningen när XHTML levereras på detta sätt*.

* Och omvänt, fastän pragmadirektivet är giltig XML, så kommer det inte att behandlas som en kodningsdeklaration av XML-parsers.

Å andra sidan kan filen eventuellt komma att användas som indata till andra bearbetningsprocesser som använder XML-parsers. Detta kan gälla för XML-editorer, XSLT-transformationer, AJAX, etc. Dessutom kanske det finns logik på servern som väljer om filen skall levereras som HTML eller XML. Av dessa skäl bör du, om du inte använder UTF-8 eller UTF-16, lägga till en XML-deklaration i början av uppmärkningen, även om filen levereras till webbläsaren som HTML. Då kommer början av filen att se ut som följer:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http‎://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
...

Om du ändå faktiskt använder UTF-8 eller UTF-16 så behövs inte XML-deklarationen, eftersom meta-elementet stöder visuell granskning av kodningen.

Att stödja äldre webbläsare. Om det finns någonting före DOCTYPE-deklarationen i en sida som läses av Internet Explorer 6, så kommer sidan att visas i s.k. quirks mode. Om du använder UTF-8 eller UTF-16 så kan du utesluta XML-deklarationen, och då får du inga problem.

Om du däremot inte använder någon av dessa kodningar, och användare av Internet Explorer 6 är en betydande del av dina läsare, och om ditt dokument innehåller konstrukter som påverkas av skillnaderna mellan standards mode resp. quirks mode, då kan detta vara ett problem. Om du vill försäkra dig om att dina sidor visas på samma sätt i alla standardstödjande webbläsare så måste du lägga till kompensation i din CSS för att eliminera skillnaderna.

Det kan även finnas andra presentationsproblem som beror på XML-deklarationer, men dessa är troligen relevanta enbart för mycket äldre webbläsare. XHTML-specifikationen varnar för att processinstruktioner (eng: processing instructions) visualiseras i vissa webbläsare. Det finns även vissa webbläsare vilka tolkar XML-deklarationen som att dokumentet är någon slags främmande XML och inte HTML, och som därför kan presentera dokumentet på oväntade sätt. Du bör testa dokumentet på lämpliga webbläsare för att fastställa om detta är ett problem.

Naturligtvis, som nämnts ovan, om du använder UTF-8 eller UTF-16 så kan du utelämna XML-deklarationen, och filen kommer fortfarande att fungera både som XML och HTML. Detta är troligen den enklaste lösningen.

Att använda UTF-16

Baserat på resultat från en analys (som Google utfört 2010) av flera miljarder webbsidor, så är färre än 0,01% av webbens alla sidor kodade i UTF-16. I de flesta fall kommer du enklare undan om du väljer UTF-8 som kodning (vilket i samma analys var 50% av alla webbsidor). Ett skäl för detta är att det finns speciella regler för att deklarera kodning av en UTF-16-sida.

I denna artikel ger vi en allmän rekommendation att du bör deklarera kodningen i dokumentet, även om du också deklarerar det i HTTP-huvudet. HTML5-specifikationen förbjuder dock för närvarande användning av charset-attributet i metaelement och användning av pragmadirektivet för att deklarera UTF-16. Det finns pågående diskussioner om detta verkligen är ett nödvändigt förbud, och detta kan komma att ändras. För tillfället bör du, om du vill att din HTML5-kod skall vara valid, inte använda deklarationer medelst element för UTF-16-kodat innehåll.

Oavsett om du använder elementbaserade deklarationer eller ej, så bör du försäkra dig om att du alltid har ett byteordningsmärke alldeles i början av UTF-16-kodade filer. Detta är på sätt och vis en deklaration i dokumentet.

Dessutom, om din sida är kodad i UTF-16, deklarera inte din fil som "UTF-16BE" eller "UTF-16LE" – använd endast "UTF-16". Byteordningsmärket i början av filen anger om kodningsschemat är little-endian eller big-endian. (Detta gäller eftersom innehåll explicit angivits som kodat i t.ex. UTF-16BE, inte bör ha ett byteordningsmärke, men HTML5 kräver ett byteordningsmärke för UTF-16-kodade sidor).

Attributet charset på en länk

Specifikationen för HTML 4.01 beskriver ett charset-attribut som kan användas i element av typerna a, link och script, och som förväntas ange kodningen av dokumentet som länkas till.

Detta kan användas på en inbäddad länk på följande sätt:

See our <a href="/mysite/mydoc.html" charset="ISO-8859-1">list of publications</a>.

Du skulle även kunna använda det för att ange kodningen av en CSS-formatmall:

<link rel="stylesheet" charset="Windows-1251" href="mystyles.css" type="text/css">

Tanken är att webbläsaren ska använda rätt kodningshantering för dokumentet som den hämtar, i de fall att dokumentets kodning inte beskrivs på något annat sätt.

HTML5-specifikationen avråder för närvarande från att att använda detta attribut på elementen a eller link, så du bör inte använda det på dessa element.

Dessutom finns det några saker att tänka på innan man använder detta attribut. För det första så stöds det inte på ett bra sätt av brett använda webbläsare. För det andra är det svårt att försäkra sig om att informationen om kodningen är korrekt vid någon godtycklig tidpunkt. Den som skapat dokumentet man länkar till kan ha ändrat kodningen av dokumentet utan att du vet om detta. Om skaparen ännu inte har angett kodningen av dokumentet, så kommer du att begära att webbläsaren använder en felaktig avkodning. För det tredje så borde det inte vara behövligt om man följer de riktlinjer som beskrivs i denna artikel, och märker upp sina dokument med kodningsdeklarationer. Det är en mycket bättre ansats.

Detta sätt att ange en kodning av ett dokument har lägsta prioritet (dvs, om kodning anges på något annat sätt så är det det som gäller). Detta betyder att du inte heller kan använda kodningsdeklaration på länkar för att korrigera ett dokuments felaktiga deklaration.

Precedensregler

Om det finns en motsättning mellan olika kodningsdeklarationer, så används precedensregler för att avgöra vilken deklaration som skall gälla. För XHTML och HTML är precedensreglerna som följer, med nummer 1 som högsta prioritet.

  1. HTTP:s Content-Type-huvud
  2. byteordningsmärke (BOM)
  3. XML-deklaration
  4. metaelement
  5. charset-attribut på länk

Att HTTP-huvud har högsta prioritet är av värde, som nämnts tidigare, i situationer där kodning av dokumentet ändras av en intermediär server, eftersom sådan omkodning troligen inte modifierar deklarationer i dokumentet. Servers som utför omkodning bör deklarera den nya kodningen i ett HTTP-huvud.

HTML5-specifikationen (som ännu inte är helt fastlagd) beskriver formellt vilken precedens som gäller för byteordningsmärket (BOM). Enligt specifikationen ska BOM ha lägre prioritet än ett HTTP Content-Type-huvud, men högre prioritet än övriga typer av deklarationer. När detta skrivs var inte detta beteende konsistent implementerat i de senaste versionerna av mer använda webbläsare. Den som vill få mer information om detta kan titta på testresult.

Tala om för oss vad du tycker (på engelska).

Prenumerera på en RSS-kanal.

Nya resurser

Nyheter på hemsidan

Twitter (Nyheter på hemsidan)

‎@webi18n

Mer att läsa

Av: Richard Ishida, W3C. Översättare: Olle Olsson, SICS.

Valid XHTML 1.0!
Valid CSS!
Kodad i UTF-8!

Översatt från engelskt innehåll skapat/ändrat 2010-09-09. Översättningen senast ändrad 2011-08-17 14:52 GMT

Information om ändringar i orginaldokumentet kan fås genom att söka efter qa-html-encoding-declarations i i18n-bloggen.