Szkielet dokumentu#
Kodowanie znaków#
Z uzyskaniem polskich znaków początkowi webmasterzy mają same problemy. Postaram się wyjaśnić na czym polega kodowanie znaków oraz deklaracja odpowiadającej strony kodowej.
Deklaracja a kodowanie#
Programy komputerowe nie mogą poprawnie zinterpretować tekstu, jeśli nie znają metody jego kodowania. Najbardziej jest to widoczne w przypadku polskich znaków diakrytycznych, które zostaną błędnie wyświetlone, jeśli program próbujący je wyświetlić nie użyje odpowiedniego kodowania. Są różne metody kodowania tekstu i przy pisaniu stron WWW będzie trzeba wybrać i ustawić odpowiednią.
Uzyskanie poprawnych znaków na stronie WWW wymaga dwóch rzeczy:
- zadeklarowania użytego zestawu znaków (w kodzie strony WWW podajemy stronę kodową)
- użycia znaków w tym zestawie (w edytorze tekstu)
Oczywiście oznacza to, że sama deklaracja (np. znacznik <meta>
) nie wystarczy, podobnie jak jedynie użycie konwertera to za mało.
Popularne standardy kodowania znaków#
Proces kodowania znaków przeprowadzają aplikacje (edytory), w których piszemy i zapisujemy dokumenty (X)HTML. Dobre edytory umożliwiają szeroki wybór stron kodowych, osobiście polecam Pajączka, Notepad2 lub Notepad++.
Stron kodowych powstało bardzo wiele, tutaj opiszę trzy najpopularniejsze. Więcej szczegółów odnośnie kodowania znaków umieściłem w dziale "Zestawy znaków". Jest to bardzo ważny i rozległy materiał, z którym można się zetknąć nie tylko podczas pisania stron WWW.
Unicode#
Unicode jest uniwersalnym zbiorem znaków obejmującym praktycznie wszystkie używane rodzaje pisma i symbole. Istnieje kilka sposobów zapisu znaków Unicode (dostosowanych bardziej dla pism europejskich lub azjatyckich).
Tak duży zestaw znaków musi zostać odpowiednio zaimplementowany w oprogramowaniu. W tym celu przeprowadza się proces kodowania. Najbardziej znane metody kodowania dla Unikodu to: UTF-8, UTF-16 i UTF-32. Na potrzeby WWW najwłaściwszym wyborem będzie UTF-8. To kodowanie zapisuje podstawowe znaki jako pojedyncze bajty, a znaki specjalne (w tym polskie) uzyskuje z kombinacji kilku bajtów. Tekst w języku polskim zwiększa swoją objętość o ok. 5%, ale za to nie ma potrzeby stosowania encji do znaków specjalnych jak np.
i —
.
UTF-8 jest przyszłością webmasterstwa, dlatego już teraz zachęcam do jego stosowania. Według Google w 2010 roku ponad 50% stron wykorzystywała ten standard. Ponadto w przypadku poprawnego XHTML-a jest ustawiany domyślne.
ISO-8859-2#
Starsza metoda kodowania obejmująca tylko zestawy kilkuset znaków. Przez to ograniczenie powstało ich bardzo wiele. Polskie znaki zawiera kodowanie ISO-8859-2, inaczej zwane ISO-Latin-2 (albo prześmiewczo "izolatka"). Jest to międzynarodowy standard, a "przy okazji" także Polska Norma, najczęściej wykorzystywana na polskich stronach WWW. Większość systemów operacyjnych/przeglądarek radzi sobie z nim bez problemu.
Windows-1250#
Kodowanie Windows-1250 (lub cp1250) jest wewnętrznym systemem kodowania, stosowanym w starszych programach firmy Microsoft. Kodowanie to jest niezgodne z normami ASCII - polskie znaki Microsoft umieścił w obszarze zarezerwowanym dla kodów specjalnych (escape codes), dlatego pliki kodowane w Windows-1250 przez niektóre programy słusznie są uznawane za binarne, a nie tekstowe.
Objawem użycia znaków Windows-1250 zamiast ISO-8859-2 jest pojawianie się "1" zamiast "ą" oraz kwadracika zamiast "ś". Jeśli kodowanie jest całkiem źle zadeklarowane, to znak "3" widoczny jest zamiast "ł".
Stosowanie leciwego kodowania Microsoftu w Internecie, jak każde łamanie standardów, jest niemile widziane, dlatego należy o nim zapomnieć. Stronę kodową Windows obsługują tylko przeglądarki w systemie MS Windows - jeśli użytkownik będzie posiadał inny system operacyjny, prawie na pewno spowoduje to pojawienie się u niego na ekranie zupełnie nieprzewidzianych znaków! Czy chcesz, aby Twoja strona WWW wyglądała nieprofesjonalnie?
Deklaracja strony kodowej#
Wiemy już w jaki sposób odbywa się tworzenie (zapisywanie) plików z wykorzystaniem interesującej nas strony kodowej. Teraz należy poinstruować przeglądarkę w jakim kodowaniu utworzyliśmy nasz plik, żeby przy wyświetlaniu nie wystąpiły słynne "krzaczki". Sposobów deklaracji strony kodowej mamy kilka.
Znacznik <meta>
#
Deklarację użytego zestawu znaków powinno się wysyłać bezpośrednio w nagłówkach serwera (poza dokumentem), ale najczęściej autorzy stron nie mają takiej możliwości. Wynika to głównie z obostrzeń nałożonych przez firmy hostingowe oferujące miejsce na swoim serwerze (nie mamy możliwości zmiany konfiguracji serwera). Z tego powodu powstał tag <meta>
.
W tym sposobie deklarację należy umieścić w sekcji <head>
, w samym pliku (X)HTML. Najlepiej jeśli kodowanie będzie pierwszą metainformacją podaną w dokumencie. Dzięki temu przeglądarka rozpozna stosowany zestaw znaków zanim przystąpi do wczytywania pozostałej treści (w szczególności dotyczy to elementu title
). Dla wyżej wymienionych stron kodowych deklaracja wygląda następująco:
<head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head>
<head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-2"> </head>
<head> <meta http-equiv="content-type" content="text/html; charset=windows-1250"> </head>
W powyższym przykładzie meta http-equiv
jest sposobem uzupełnienia nagłówków HTTP, które serwer powinien przesłać przed wysłaniem dokumentu HTML. Nagłówek content-type
określa typ dokumentu, tu text/html
. Przykładowo charset=ISO-8859-2
jest parametrem typu dokumentu i określa zastosowane kodowanie (character encodings).
Bez deklaracji strony kodowej przeglądarki przyjmują różne warianty. Mogą zastosować domyślną stronę kodową, albo próbować zgadnąć kodowanie (na podstawie odpowiednich analiz częstotliwościowych). Skuteczność mechanizmów bywa różna, dlatego też należy wystrzegać się pomijania strony kodowej.
Nagłówki HTTP#
Zamiast posługiwać się półśrodkiem, jakim jest <meta>
, można wysłać kodowanie w nagłówkach HTTP. Wymaga to dostępu do konfiguracji serwera albo generowania dokumentów przez skrypt po stronie serwera.
W przypadku serwera Apache możemy skorzystać z dyrektywy AddDefaultCharset w plikach konfiguracyjnych lub z .htaccess, przykładowo:
AddDefaultCharset utf-8
lub
AddCharset utf-8 .html
lub
AddType 'text/html;charset=utf-8' html
Dla języka skryptowego po stronie serwera np. PHP istnieje specjalna funkcja header()
wysyłająca nagłówki HTTP. Poniższa deklaracja zastępuje nam tag <meta>
:
<?php header("Content-Type: text/html; charset=ISO-8859-2"); ?>
Pisanie w innym języku niż rodzime "ogonki"#
Jeśli strona ma być napisana w innym języku niż polski, należy zadeklarować odpowiednio inną stronę kodową (pamiętaj również o podaniu właściwego skrótu nazwy języka). Dla Unicodu problem nie istnieje, kodowanie obejmuje większość znaków stosowanych w różnych alfabetach.
Kodowanie serwera i kodowanie dokumentu#
Jedną z częstszych przyczyn krzaków na stronach internetowych jest konflikt między kodowaniem ustawionym przez serwer i kodowaniem zastosowanym przy pisaniu dokumentów. Jeśli kodowanie serwera ustawione jest np. na iso-8859-1, to nie zobaczymy polskich znaków diakrytycznych na swojej stronie, mimo tego, że w dokumencie znaki są poprawnie zakodowane i w nagłówku umieszczony został tag <meta>
.
Kodowanie ustawione przez serwer ma największy priorytet i nie może zostać nadpisane przez żadną deklarację w dokumencie.
Zmiana kodowania w samej przeglądarce#
Bywają sytuacje, kiedy wygrzebiemy z Internetu ciekawą stronę, na której autor rozminął się z deklaracją a zastosowaną stroną kodową w dokumencie. W takim przypadku niewiele przeczytamy, na upartego możemy ręcznie wybrać kodowanie znaków stosowane przez przeglądarkę.
W przypadku Firefoksa wystarczy kliknąć na Widok >> Zestaw znaków i sprawdzić kolejno najpopularniejsze strony kodowe.
W Operze wybieramy kolejno Widok >> Kodowanie i wybieramy interesujący nas zestaw znaków.
W przypadku IE 6/7/8 postępujemy analogicznie jak dla Opery.
Dla Chrome klikamy Opcje strony >> Kodowanie po czym zaznaczamy interesujący standard.
W najnowszych przeglądarkach sposoby zmian stron kodowych mogą wyglądać nieco inaczej. Związane jest to z parciem na minimalistyczny interfejsu programu, dlatego położenie i nazwy poszczególnych opcji mogą ulec zmianie.
Jak przekonwertować dokumenty?#
Jeżeli piszemy dokumenty w starych, problematycznych edytorach (np. Notatnik), przed umieszczeniem plików w Sieci niezbędne jest przekodowanie dokumentów na standard ISO. Dzięki temu nasza strona trafi do większego grona odbiorców.
Na rynku dostępnych jest wiele narzędzi służących do konwersji tekstu z jednej strony kodowej na inną. Jednym z lepszych jest Gżegżółka. Jest to bardzo rozbudowany program, obsługujący większość standardów kodowania stosowanych na całym świecie.
Garść przykładów#
Na zakończenie umieszczam kilka plików, w których zastosowałem różne kodowania i odmienne deklaracje stron kodowych. Z podobnym efektem wyświetlania poszczególnych plików niejednokrotnie możesz zetknąć się w Internecie.
- Przykład 1 - kodowanie: UTF-8 (bez BOM), deklaracja strony kodowej: UTF-8, typ MIME:
application/xhtml+xml
- Przykład 2 - kodowanie: UTF-8 (bez BOM), deklaracja strony kodowej: ISO-8859-2, typ MIME:
application/xhtml+xml
- Przykład 3 - kodowanie: ISO-8859-2, deklaracja strony kodowej: Windows-1250, typ MIME:
application/xhtml+xml
. Parser XML poinformuje nas o błędach w stosowanych znakach (prócz Chrome, które poradzi sobie z tym zadaniem). - Przykład 4 - kodowanie: UTF-8 (z BOM - Notatnik), deklaracja strony kodowej: UTF-8, typ MIME:
application/xhtml+xml
- Przykład 5 - kodowanie: UTF-8 (bez BOM), deklaracja strony kodowej: UTF-8, typ MIME:
text/html
- Przykład 6 - kodowanie: UTF-8 (bez BOM), deklaracja strony kodowej: ISO-8859-2, typ MIME:
text/html
- Przykład 7 - kodowanie: UTF-8 (z BOM - Notatnik), deklaracja strony kodowej: UTF-8, typ MIME:
text/html
- Przykład 8 - kodowanie: Windows-1250, deklaracja strony kodowej: Windows-1250, typ MIME:
text/html
Mam nadzieję, że po tak pieczołowitym objaśnieniu nikt nie będzie miał problemów z uzyskaniem polskich znaków. Tematy dotyczące kodowania znaków zakładane na różnych forach przez początkujących webmasterów zaczynają irytować nawet mnie (wybaczcie).