Ta część opracowania ma charakter ściśle techniczny i przy pierwszym czytaniu można ją pominąć. W pewnym sensie stanowi ona uzupełnienie rozdziału o kodach informacyjnych.
Wiemy, że plik źródłowy dokumentu HTML jest plikiem znakowym zawierającym warstwę treściową, uzupełnioną znacznikami. Jeżeli plik zapisano w kodzie informacyjnym UNICODE, to może on zawierać kod (numer) każdego spośród dostępnych znaków tego wielkiego alfabetu. Tym sposobem zapisano np. przedstawiony niżej wielojęzyczny dokument.
Z dobrodziejstw UNICODE najłatwiej jest korzystać, posiadając edytor obsługujący kodowania UNICODE (najlepiej UTF-8). Sytuacja szybko się zmienia na korzyść, ale w obecnej chwili wiele systemów posiada jedynie edytory plików znakowych ASCII. Tak więc może się okazać, że nie w każdym miejscu będziemy w stanie przeredagować dany plik znakowy z uwagi na użyty w nim standard kodowania.
Co prawda nie każdy znak UNICODE da się wpisać do pliku wprost z klawiatury (ile potrzeba by klawiszy?), ale wiele edytorów wspomaga użytkownika za pomocą skrótów klawiaturowych i tabel znaków.
Korzystanie z tabeli znaków bywa wygodne, lecz na dłuższą metę ogranicza użytkownika dając jedynie możliwość odszukania i wstawienia wzorca. Wstawianie dziesiątków znaków techniką „znajdź, skopiuj, wklej” jest bardzo nieefektywne i frustrujące.
Lepszym rozwiązaniem jest korzystanie z takiego edytora, który daje możliwość zaprogramowania skrótów klawiszowych, tak by użytkownik mógł wygenerować najczęściej potrzebne znaki za pomocą klawiatury. Jeżeli użytkownik sensownie skonfiguruje swoje środowisko, to będzie wprowadzał znaki bardzo sprawnie. Nie jest jednak najrozsądniejszą rzeczą oczekiwać, że zawsze i wszędzie będzie dostępny taki sam edytor w takiej samej konfiguracji.
Sytuacja wygląda poważniej, jeżeli plik dokumentu jest tworzony przy użyciu kodu ASCII lub któregoś z jego 256-znakowych rozszerzeń. W takim pliku da się przechować jedynie znaki reprezentowane w danym kodowaniu. Powstaje pytanie: w jaki sposób odwzorować znaki, które nie należą do obsługiwanego zbioru. Przy każdym ustalonym kodowaniu jesteśmy w stanie wskazać wiele takich znaków; najczęściej zależy nam na wybranych znakach typograficznych, symbolach matematycznych i literach obcych alfabetów.
W takim przypadku współpraca z graficzną tabelą znaków jest przynajmniej częściowo skazana na niepowodzenie: korzysta ona z mechanizmu schowka i związanych z nim konwersji kodu informacyjnego, zatem niektóre znaki — te, które nie mają reprezentacji w formacie docelowym — będą „gubione”. Na dodatek korzystanie z tabel znaków wymaga pracy w środowisku graficznym, które mimo że jest przydatne, a być może nawet przyjazne, na pewno nie jest niezbędne do utworzenia pliku źródłowego.
Nawet te dokumenty HTML, których pliki źródłowe zapisane zostały za pomocą kodu ASCII, mogą zawierać dowolne znaki UNICODE. W niniejszym rozdziale przedstawimy technikę służącą temu celowi. Dokumenty tworzone w myśl tej techniki są plikami znakowymi ASCII, nadają się więc do przesyłania pocztą elektroniczną, do znakowej transmisji ftp, do przesyłania przez schowek środowiska graficznego między programami pracującymi w oparciu o różne alfabety itp. Pliki UNICODE, jako „binarne”, wymagają zachowania większej ostrożności i są bardziej narażone na uszkodzenie.
Jak powiedziano wcześniej, pliki źródłowe HTML mogą zawierać
ciągi źródłowe postaci &nazwa;
, zwane
jednostkami znakowymi. Treść ciągu znaków nazwa
musi stanowić legalną nazwę jednostki znakowej. Jednostka taka generuje pojedynczy znak
pojawiający się w sformatowanym dokumencie.
Dotychczas tym sposobem generowaliśmy wybrane znaki typograficzne.
Tak otrzymywaliśmy np.
znak nierówności <
z jednostki <
oraz
znak pauzy —
z jednostki —
.
Obecnie omówimy ten mechanizm dokładniej.
nazwa
jednostki odnosi się zawsze do pewnego znaku UNICODE.
W definicji języka HTML, począwszy od wersji 4.0 z 1998 roku, wprowadzono wiele nazw
jednostek znakowych dla znaków alfabetów narodowych, symboli typograficznych i znaków specjalnych,
w tym matematycznych.
Na przykład każdej literze greckiej odpowiada nazwana jednostka znakowa, której nazwa brzmi tak,
jak (angielska!) nazwa danej litery:
α
to „α”,
δ
to „δ”,
μ
to „μ”,
Α
to „Α”,
Δ
to „Δ”,
Μ
to „Μ” itd.
Nazwy jednostek są niezależnie od nazw dostępnych fontów, choć oczywiście do poprawnego przedstawienia znaku opisanego przez taką jednostkę odpowiedni font jest niezbędny. Ważne, że mechanizm jednostek znakowych opisuje właściwości znaku bez odwoływania się do stosowania fontów.
Każda nazwana jednostka znakowa HTML odpowiada pewnemu znakowi UNICODE, ale nie każdy znak UNICODE ma swoją nazwę symboliczną. W razie potrzeby można jednak jawnie posłużyć się numerem danego znaku UNICODE, umieszczając w tekście źródłowym nazwę jednostki w postaci numerycznej, a nie symboliczej.
Na przykład znak pauzy ma w UNICODE numer 8212, czyli x2014 w zapisie szesnastkowym.
Zamiast pisać —
, moglibyśmy więc pisać
—
lub —
.
Ale kto to spamięta, a później odczyta? Nazwy symboliczne wymyślono
po to, żeby ludzie ich używali zamiast nic nie mówiących numerów.
Na przykład znak A
, oznaczający wielką literę A
,
ma w UNICODE, podobnie jak w ASCII,
numer 65. Tak więc jednostka A
, umieszczona w pliku źródłowym
HTML, będzie generować znak A
w dokumencie.
Na tej zasadzie można korzystać nie tylko z numerów dziesiętnych, ale
także szesnastkowych: ponieważ 65=x41, ten sam znak wygenerujemy pisząc
A
: oto jest A
.
Tylko po co, skoro ten sam efekt otrzymamy, pisząc w pliku źródłowym zwykłe A
(to znaczy znak numer 65, a nie jego nazwę)?
Gdybyśmy chcieli korzystać konsekwentnie z numerycznych nazw jednostek znakowych,
moglibyśmy wygenerować zdanie Ala ma Asa.
w następujący sposób:
Ala ma Asa.
tak, jak tutaj: Ala ma Asa.
.
(Znak numer 46 na końcu przykładu to kropka kończąca zdanie).
Litera ż
ma w UNICODE numer 380=x017c (uwaga! nie jest to numer 191,
jaki ta sama litera ma w stronie kodowej ISO-Latin-2!).
Litera ó
ma w UNICODE numer 243=x00f3 (tak samo, jak w ISO-Latin-2, ale to wyjątek).
Podobnie, litera ł
ma w UNICODE numer 322=x0142 (chociaż w ISO-Latin-2 ma ona numer 179).
Zatem zdanie Ala ma żółwia.
można zakodować w postaci z numerami szesnastkowymi
*la ma żółwia.
otrzymując: Ala ma żółwia.
,
lub dziesiętnymi
*la ma żółwia.
Proszę bardzo: Ala ma żółwia.
.
To samo zdanie otrzymamy oczywiście z tekstu
Ala ma żółwia.
Nietrudno się przekonać, że tworzenie w ten sposób pliku źródłowego nie jest ani wygodne, ani czytelne, ani sensowne. Tym niemniej, jeżeli potrzebujemy w dokumencie pewnego znaku UNICODE, który nie wchodzi w skład używanej przez nas strony kodowej, ani nie ma odpowiedniej jednostki o nazwie symbolicznej, to skorzystanie z jednostki o nazwie numerycznej jest dobrym rozwiązaniem.
Na przykład UNICODE zawiera wiele symboli strzałek nadających się do wykorzystania przy opisie reakcji chemicznych. Symboli tych (przynajmniej na razie) nie opisuje żadna standardowa nazwana jednostka znakowa HTML. Najprostszym sposobem uzyskania strzałek
⇄
jest użycie jednostki ⇄
(numer szesnastkowy) lub ⇄
(numer dziesiętny).
Poniżej przedstawiono dokument analogiczny do początkowego przykładu, ale korzystający 256-znakowego alfabetu. Znaki spoza dostępnego zestawu są w nim reprezentowane za pomocą jednostek znakowych.
Tym samym sposobem wygenerowano pojedyncze słowa francuskie i rosyjskie występujące w kilku częściach niniejszego opracowania, np. tekst:
zero zéro нуль
powstał na podstawie kodu źródłowego
zero zéro нуль
(Mała litera e-z-kreską, czyli small-letter-e-with-acute-accent
— w UNICODE pod numererm 233=xe9 —
ma swoją jednostkę symboliczną é
.
Litery cyrylicy nie mają zdefiniowanych jednostek symbolicznych.)
Ponieważ odwołujemy się do UNICODE, będącego dobrze zdefiniowanym standardem niezależnym od oprogramowania (tzn. oprogramowanie korzysta z UNICODE, a nie odwrotnie), jest szansa na zachowanie czytelności dokumentu przekazywanego w postaci źródłowej bez względu na to, czy dana przeglądarka dysponuje fontami zawierającymi odpowiednie znaki. Na przykład przeglądarka Lynx pracująca na terminalu znakowym nie obsługującym UNICODE, być może wykona transliterację znaków cyrylicy do alfabetu łacińskiego:
zero zero nul'
Nazwa jednostki znakowej, czy to symboliczna, czy numeryczna, składa się wyłącznie ze znaków ASCII. Dlatego plik źródłowy, w którym znaki dokumentu są opisane jako jednostki, nie będzie narażony na uszkodzenie podczas transmisji znakowej protokołem ftp lub pocztą elektroniczną. (Przypomnijmy, że transmisja binarna nie naraża na uszkodzenie żadnego pliku).
Jest też możliwe, że automat zapisujący przeglądany właśnie dokument HTML zastosuje nazwy numeryczne jednostek, mimo że oryginał pliku źródłowego zawierał nazwy symboliczne. Może też bez ostrzeżenia dokonać konwersji na swój własny, specyficzny system kodowania znaków (np. zależny od posiadanych fontów), przez co tekst źródłowy przestanie być uniwersalny.
Tak więc mamy istotne powody, by w kontaktach z automatami zachowywać zdrowy rozsądek nie pozbawiony rezerwy.
Jeżeli opisana wyżej technika wydaje się sztuczna i skomplikowana,
to nie ma potrzeby zmuszać się do jej stosowania. Jednak przy pewnej
wprawie korzystanie z niej jest o wiele szybsze, niż wyszukiwanie
i wstawianie znaków bezpośrednio z katalogu wzorców. Nazwy najczęściej
używanych jednostek są związane z tradycyjnymi nazwami znaków typograficznych,
więc można je zapamiętać na zasadzie skojarzeń
pauza → em-kreska → em-dash → mdash →
,
które dość łatwo jest przywoływać z pamięci.
—
Warto też wypracować sobie własne techniki robocze, np. polegające na pisaniu kilkuelementowych zestawów znaków i zastępowaniu ich, półautomatycznie lub automatycznie, odpowiednimi znakami UNICODE lub ich nazwami.
Na przykład pisanie zestawów ,, oraz '' jest zawsze szybsze, niż wstawianie od razu właściwych cudzysłowów. Odpowiednio silny edytor można skonfigurować tak, by sam od razu zastępował taki ciąg znaków odpowiednim symbolem, czyli „ lub ”, albo jego nazwą, czyli „ lub ”. Jeżeli w wybranym przez nas edytorze jest to niemożliwe, zawsze można wymusić zamianę fraz: ,, → „ oraz '' → ”, względnie ,, → „ oraz '' → ”. Zauważmy też, że stosowanie cudzysłowów " utrudnia przeprowadzenie takiej zamiany, gdyż trzeba wtedy analizować znak wraz z kontekstem jego wystąpienia.