Porozumění tomu, jak služba IIS zpracovává kódování ASP
Stejně jako u všech problémů s kódováním v klasickém ASP pomáhá pochopit, jaký účel plní různé příkazy (lidé je příliš často používají nesprávně, protože se zdá, že problém řeší) .
<%@ Language = "VBScript" CodePage = 65001 %>
Tento řádek je běžně nepochopený, syntaxe <%@
je "ASP @ Processing Directive" a slouží k tomu, aby IIS řekl, jak zpracovat stránku ASP, a je pravděpodobně jedním z nejdůležitějších příkazů, pokud jde o práci se správným kódováním.
-
@Language
říká IIS, jaký registrovaný aktivní skriptovací jazyk by měl být použit ke zpracování stránky ASP. -
@CodePage
říká IIS, jaká CodePage by měla být použita ke zpracování stránky ASP. Pokud byla stránka uložena pomocíUTF-8
pak IIS potřebuje při zpracování stránky vědět, že má použít CodePage65001
(jinak známé jakoUTF-8
) .
To znamená, že @CodePage
by měl vždy odpovídat fyzickému kódování, které bylo použito při vytvoření stránky. K tomu možná budete muset použít pokročilý textový editor, některé příklady jsou Poznámkový blok++
(zobrazuje kódování na stavovém řádku v pravém dolním rohu okna GUI) a Visual Studio
(Má skrytý příkaz nabídky s názvem Advanced Save Options
ke kterému lze přistupovat přizpůsobením panelu nabídek) .
<% Response.CodePage = 65001 %>
Opět často nepochopeno, účelem tohoto příkazu je sdělit IIS, jak by měly být kódovány dynamické řetězce (dynamickými řetězci máme na mysli vše, co je vygenerováno pomocí Response.Write()
) . Pravděpodobně nejdůležitější část celého procesu, pokud je nastavena nesprávně nebo se předpokládá, že může dojít k nesouladu kódování a také dochází.
<% Response.CharSet = "UTF-8" %>
Tento příkaz nastavuje ;charset=utf-8
v Content-Type
Hlavička HTTP, když je odpověď odeslána ze serveru do klientského prohlížeče, sděluje prohlížeči, že tato odpověď by měla být zpracována jako UTF-8
spíše než výchozí. Znamená kód jako
Response.AddHeader "Content-Type", "text/html; charset=utf-8"
je nadbytečné a nemělo by se používat. Také stojí za zmínku, že existuje příkaz pro Content-Type
HTTP hlavička také
Response.ContentType = "text/html"
což je ještě více nadbytečné, než již bylo.