2011-08-18 11 views
5

Parsuję wiele witryn. Wszystko działa dobrze, czytam także deklaracje zestawu znaków do konwersji kodowania. Teraz mam problem z http://celleheute.de/sonntagsfuhrung-3/.Preferuj deklarację zestawu znaków w metatagu HTML lub nagłówku HTTP?

Metatag HTML mówi, że treść jest zakodowana jako ISO-8859-2, ale nagłówek HTTP mówi, że jest to kodowanie UTF-8. I rzeczywiście, treść jest kodowana w UTF, więc gdy mój parser spróbuje przekonwertować zawartość na ISO, spowoduje to przerwanie niektórych znaków.

Teraz moje pytanie brzmi, jaką deklarację powinienem wybrać? Czy powinienem zignorować metatagi, kiedy mogę znaleźć deklarację w nagłówku HTTP lub odwrotnie? Co zrobi większość przeglądarek internetowych?

Odpowiedz

10

Aby zrozumieć, co zrobić nowoczesnych przeglądarek, należy zacząć czytać na http://dev.w3.org/html5/spec/parsing.html#determining-the-character-encoding

krokach jeden i dwa są najbardziej istotne pytania. Mówią

  1. Jeśli użytkownik wyraźnie poinstruował agenta użytkownika, aby zastąpić kodowanie znaków dokumentu z określonym kodowaniem, ewentualnie że zwrot kodowania z pewnym zaufaniem i przerwać te kroki.

  2. Jeśli warstwa transportowa określa kodowanie i jest obsługiwana, zwracana jest kodowanie o pewności pewnej i przerywanie tych kroków: .

co oznacza, że ​​nagłówek HTTP prawdziwy ma pierwszeństwo nad wszystkim z wyjątkiem użytkownik over-ride.

Poza tym może się skomplikować. Znacznik kolejności bajtów może na przykład mieć pierwszeństwo przed metatagiem.


UPDATE: Ponieważ odpowiedź ta została napisana, spec zmieniony (około połowy 2012 roku), dzięki czemu bom teraz ma pierwszeństwo przed nagłówku HTTP.

3

Po prostu nie ma na to odpowiedzi. Autor strony popełnił błąd, podając sprzeczne informacje. Która z nich jest prawidłowa może równie dobrze zostać rozstrzygnięta przez rzut monetą.

Ogólnie wolę nagłówek HTTP jako wartość podstawową. Meta tag jest tak samo jak i awaryjny. Jeśli chcesz podążać za jakąkolwiek logiką, najpierw spróbuj zdekodować dokument, używając zestawu znaków określonego w nagłówku HTTP. Jeśli to wyraźnie nie powiedzie się, ponieważ niektóre bajty są nieprawidłowe w danym kodowaniu, spróbuj ponownie w zestawie znaków określonym w metatagu, jeśli taki istnieje. Jeśli to się nie powiedzie, wszystkie zakłady są wyłączone.

Jeśli żadna z nich nie powiedzie się, ale konflikt kodowania, albo zaangażuj człowieka, albo spróbuj wykonać analizę statyczną dekodowanego tekstu, która może Ci powiedzieć, która jest bardziej prawdopodobna.

Powiązane problemy