Att ange 'charset'-information i .htaccess

Fråga

Hur kan jag använda .htaccess-direktiv i en Apache-server för att leverera filer med en speciell kodning

Bakgrundsinformation

Det är viktigt att säkerställa att den information om teckenkodning som servern sänder är korrekt, eftersom informationen i HTTP-headern har högre prioritet än informationen i själva dokumentet.

Många Apache-servrar konfigureras för att sända filer kodade i ISO-8859-1 (Latin-1). I de exempel som ges i denna FAQ antar vi att du vill leverera dina filer i en annan kodning än den som angivits i standardkonfigurationen. (Råd om hur man väljer en kodning ges i tutorialen Choosing & applying a character encoding.)

Nedan följer ett exempel på en HTTP-header som åtföljer en fil levererad till ett användarprogram. I detta fall inkluderas kodningsinformationen i Content-Type-headern på andra raden från slutet.

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-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

I exemplet anger Content-Type-headern såväl filens MIME-typ som dess teckenkodning. MIME-typen beskriver formatet på den levererade filen. HTML-filer levereras vanligtvis som text/html. Den här filens teckenkodningen (eller 'charset') är UTF-8.

Information om hur man kan få reda på vilka HTTP-headers som levereras med en fil fås i artikeln Kontrollera HTTP-headers.

Filer på en Apache-server kan levereras med en teckenkodningsdeklaration, enligt serverns normalfallsinställning ("default"), i HTTP-headern som inte stämmer överens med filens verkliga kodningen. Den information om teckenkodning som servern sänder kan vara den normalfallsinställning som kommer med installationen, kan vara en normalfallsinställning satt av systemadministratören, eller kan vara en effekt av diverse Apache-direktiv. Annars sänder inte servern någon information om teckenkodning.

Om servern har konfigurerats så att användare eller administratörer kan ändra information i .htaccess-filer, så kan dessa filer erbjuda ett sätt att ersätta normalfallsinställningarna. Denna FAQ visar hur man gör detta.

Svar

Det finns några olika scenarier som man bör skilja åt. Å ena sidan så kanske du vill ändra normalfallsinställningen för alla filer i en folder, filer vars namn har ett visst suffix. Å andra sidan kanske du vill ändra inställningen för en enda fil eller för ett litet antal filer. Vi beskriver dessa fall i tur och ordning.

Exempeln nedan förutsätter att servern levererar filer, enligt normalfallsinställningen, som ISO-8859-1, men att du vill få din fil (eller filer) levererad som UTF-8 (vilket är ett förnuftigt val!)

Är detta svar meningfullt för dig?

Denna artikel har skrivits för innehållsförfattare snarare än för systemadministratörer. Hur man sätter serverns normalfallsinställning för teckenkodning, det ligger bortom vad denna artikel försöker beskriva.

Dessa råd är relevanta bara om det räcker med att ange dina filers teckenkodning genom HTTP-headern. I vissa fall kanske du inte vill göra på det sättet.

Lägg märke till att denna FAQ förutsätter att din server har konfigurerats för att använda .htaccess-filer, och att direktivet som beskrivs nedan fungerar i .htaccess-filer på din server. Vi förutsätter även att det är olämpligt att helt enkelt ända standardkonfigurationen på servern. Om du inte är helt säker på vad som gäller för din server, kontakta då din systemadministratör.

Du måste också vara medveten om vilka konventioner som din server använder, konventioner som beskriver hur filnamnssuffix relateras till teckenkodningar. I vissa fall kan servern ha konfigurerats under antagandet att teckenkodningen av en fil indikeras av kodningsspecifika suffix. T.ex. kan för dokument.html.utf8 gälla att suffixet .utf8 associeras till en teckenkodning, medan .html associeras till en filtyp.

Om ingen av dessa ansatser fungerar, så tag del av innehållet i Apache-dokumentationen (se nedan angivna länkar) eller kontakta din systemadministratör.

Ange med suffix

Använd Apache-direktivet AddCharset för att knyta en teckenkodning till alla filer vars namn har ett visst suffix, i den aktuella foldern och alla dess underfoldrar. Om man vill leverera alla filer vars namn har suffix .html som UTF-8, skriv då in i .htaccess-filen följande rad:

AddCharset UTF-8 .html

Suffixet kan anges med eller utan inledande punkt. Du kan lägga till ytterligare suffix på samma rad. Detta fungerar även om du har filnamn som example.en.html eller example.html.en.

Detta exempel medför att alla filer med suffix .html kommer att levereras som UTF-8. HTTP Content-Type-headern kommer att innehålla en rad som slutar med 'charset'-information enligt följande exempel.

Content-Type: text/html; charset=UTF-8

Anm: Alla filer med detta suffix, i alla underfoldrar av aktuell folder, kommer också att levereras som UTF-8. Om du, av någon anledning, behöver få en speciell fil levererad med annan kodning, så behöver du ange ytterligare direktiv.

Anm: Du kan knyta en teckenkodning till godtyckligt suffix på filnamn. Antag t.ex. att du vill stödja språkförhandling och att du har två sidor i två olika språk som namngivits enligt principen example.en.html och example.ja.html. Antag dessutom att det går bra att leverera de engelska sidorna med serverns normalfallsinställning som ISO-8859-1, men de japanska filerna måste levereras som UTF-8. För att åstadkomma detta kan du knyta teckenkodning till språk-suffix på följande sätt:

AddCharset UTF-8 .ja

Lägg dock märke till att det faktiskt är bättre att ändra serverns normalfallsinställning till UTF-8, och leverera alla filer i nya foldrar som UTF-8.

Anm: Det är också möjligt att uppnå samma resultat genom att använda Apache-direktivet AddType, även om detta direktiv anger både teckenkodning och MIME-typ på samma gång. Vilket alternativ som är mest lämpligt kan till del bero på hur du använder suffix för innehållsförhandling. Om du använder olika suffix för att uttrycka dokumenttyp och teckenkodning, så kan detta senare alternativ vara mindre lämpligt.

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

Hantering av enstaka fil

Låt oss anta att du vill leverera en enda fil i en folder som UTF-8, medan de många övriga filerna i denna folder skall levereras som ISO-8859-1. Filen du skall få levererad som UTF-8 heter example.html. Konstruera din .htaccess-fil som på följande sätt:

<Files "example.html">
AddCharset UTF-8 .html
</Files>

Det vi gjorde här var att bädda in det direktiv som nämndes i föregående sektion i en uppmärkning som identifierar den specifika fil vi är intressade av. Det finns även en annan syntax för detta direktiv som gör det möjligt att ange ett antal olika filnamn med hjälp av ett s.k. reguljärt uttryck.

Anm: Man kan också få samma effekt genom att använda det tidigare illustrerade AddType-direktivet, eller, i detta fall, ett ForceType-direktiv, även om dessa anger både teckenkodning och MIME-typ.

<Files "example.html">

ForceType 'text/html; charset=UTF-8'
</Files>

Anm: Alla filer, i denna folder eller i underfoldrar, som har samma namn kommer att levereras som UTF-8, om du inte definierar ett annat direktiv i en underfolder.

Mer komplexa fall

Om två suffix-regler kan tillämpas på ett och samma dokument, då är det viktigt i vilken ordning suffixen angetts. Med följande .htaccess

AddCharset UTF-8 .utf8
AddCharset windows-1252 .html

så kommer filen 'example.utf8.html' att levereras som "windows-1252" och 'example.html.utf8' som UTF-8.