Mój pierwszy skrypt w PERLu i problem z Unicode
Podczas pisania mojego pierwszego skryptu w Perlu służącego do tworzenia strony HTML będącej połączeniem kilku kawałków (zawartych w plikach tekstowych .txt) pojawił się problem z kodowaniem wygenerowanej w ten sposób strony.
Opiszę to krótko, bo może się komuś przyda.
Załóżmy taki przypadek. Mamy trzy pliki:
gora.txt - pierwszy plik
srodek.txt - drugi plik
dol.txt - trzeci plik
We wszystkich trzech są kawałki strony HTML.
Mój skrypt miał połączyć wszystkie trzy pliki (dodając coś pomiędzy, ale to szczegół), ponieważ dla wszystkich generowanych stron chciałem mieć pewne stałe elementy kodu.
Chciałem też uniknąć sytuacji, gdy chcąc poprawić coś w nagłówku musiałbym poprawiać za każdym razem kilkanaście, czy kilkadziesiąt plików HTML (może komuś to wyda się dziwne, ale przy pisaniu kodu HTML nie korzystam z rozbudowanych edytorów, a już na pewno nie takich “magicznych” które zostawiają zaśmiecony kod. Czasami wykorzystuję BlueFish, który polecam).
Napisałem na tyle rozbudowany skrypt, że generował kilkanaście plików według kryteriów zdefiniowanych w pliku konfiguracyjnym podawanym jako parametr wejściowy.
Każdy wygenerowany plik miał zawartość wynikająca z poniższej operacji:
PLIK.HTML = gora.txt + srodek.txt + dol.txt
Zmieniała się tylko zawartość pliku srodek.txt. Gora.txt definiująca nagłówek strony i dol.txt definiujący stopkę zawsze pozostawały te same i były bezpośrednio czytane z plików wejściowych.
Wszystkie trzy pliki były napisane w gedit w GNOME w OpenSUSE z wykorzystaniem UTF-8.
Po połączeniu okazywało się, że gubiły się polskie znaki, czyli na przykład słowo “źródło” w pliku srodek.txt (zapisanym w Unicode) zamieniało się na jakiś zestaw niezrozumiałych krzaczków w pliku wyjściowym HTML. Dodanie “use locale;” do skryptu nic nie dawało.
Szukałem w internecie i nic (choć znalazłem ciekawe opisy). Polecane metody nie działały. Rozwiązanie znalazłem przypadkowo (może dla kogoś kto zna dobrze Perl jest ono oczywiste, ale dla mnie to pierwszy poważniejszy skrypt i pierwsze problemy).
Powodem błędnego przetwarzania nie były błędy kodowania plików wejściowych, ale to, że sam skrypt zacząłem pisać w systemie Windows i plik nie był zapisany w systemie Unicode tylko w ISO. Edytując go w gedit, kodowanie pozostawało bez zmian. Kiedy zapisałem plik programu skryptu “generuj.pl” w Unicode to problem zniknął. Być może sytuacja podobna do mojej nie często się zdarza.
Może ktoś doświadczony wyjaśni mi takie zachowanie skryptu, bo nie bardzo je rozumiem. Dlaczego kodowanie pliku ze skryptem miało znaczenie przy łączeniu plików zakodowanych w Unicode?
Tags: perl

