Twój ulubiony magazyn on-line

Warsztat Miguela

Witam wszystkich miłośników komputerów. Jestem MIGUEL i postaram się poprowadzić nowy regularny dział pod nazwą WARSZTAT MIGUELA. Znajdziecie tutaj różne ciekawe artykuły, które - mam nadzieję - zaskoczą niejednego z Was. W tym miesiącu zajmiemy się standardem kodowania polskich liter.


WARSZTAT MIGUELA: Polskie znaki

1) Trochę historii

Kiedy do Polski trafiły pierwsze komputery osobiste, stało się jasne, że trzeba będzie je nieco spolszczyć. Brak "ogonków" w alfabecie był wadą wykluczającą użytkowanie komputerów w biurach i urzędach, więc priorytetowym zadaniem dla informatyków stało się stworzenie standardu kodowania polskich liter w tabeli ASCII *

Ponieważ ludzie "na górze" nie mieli czasu na takie "drobiazgi", więc sprawą zajęły się specjalne firmy, które zaczęły wyrastać jak grzyby po deszczu. Używając programatorów pamięci EPROM zamieniały "niepraktyczne" znaczki i litery egzotycznych dla nas alfabetów na łatwe do strawienia przez Polaków "ogonki". W tym momencie rozpoczął się wyścig po standard. Niestety, firmy te nie chciały ze sobą współpracować i w rezultacie zamiast jednej polskiej normy, powstało kilka różniących się od siebie "standardów", jak np: Mazovia, Latin-2 czy DHN. Każdy użytkownik PC'ta wybrał sobie najwygodniejszy wariant i wszyscy już byli szczęśliwi.

*ASCII - każdy znak w komputerze posiada ściśle przyporządkowany numerek, który może mieć wartość od 0 do 255. Przykładowo duże litery mają kody od 65 do 90 a małe litery od 97 do 122. Cyfry to kody 48-57 a znaczki graficzne (semigraficzne) to kody 176-223. Standardowe znaki to zakres od 0 do 127, powyżej tej liczby znajdują się litery różnych krajów np. skandynawskie czy niemieckie. Wszelkim modyfikacjom powinno się poddawać tylko zakres 128-255.


2) Opis standardów

Jednym z pierwszych i chyba najczęściej używanych standardów DOS'owych była MAZOVIA. Aby uzyskać miejsce na polskie litery, usunięto kilka znaczków alfabetu skandynawskiego oraz znak funta - jest to chyba najlepsze rozwiązanie i dziwię się, dlaczego standard ten nie "przebił" innych.

Następnym standardem był DHN - równie popularny jak Mazovia. Dla urzędników państwowych był to jednak standard nie do przyjęcia, ponieważ usuwał z tabeli ASCII kilka liter niemieckich, a przecież w naszym kraju mieszkają osoby z tymi literami w imieniu czy nazwisku.

Trzecim standardem - stworzonym przez IBM - był LATIN II (strona kodowa 852), w którym usunięto kilka "rzadko używanych" liter, w tym także greckich oraz trzy znaczki używane do tworzenia tabelek. Z punktu widzenia matematyka był to nieciekawy pomysł a już na pewno rozczarowali się twórcy DOS'owych programów użytkowych (no bo jak tu narysować tabelkę, kiedy ubyło kilka znaczków graficznych?).

Wraz z nadejściem Windows, pojawił się standard, oznaczony jako WINDOWS-1250. Twórcy okienek stwierdzili, że graficzne znaczki do rysowania tabelek na pewno się już nie przydadzą (przecież tabelki rysuje się tylko pod DOS'em) i tym razem aż 7 znaczków zniknęło z tabeli ASCII wraz z kilkoma rzadko używanymi symbolami i dwiema literami greckimi. Ten, kto lubi sobie narysować bajerancki podpis za pomocą znaczków semigraficznych, tym razem na pewno tego nie zrobi.

Najmniej wyobraźni przy tworzeniu nowego standardu wykazali twórcy CSK i CYFROMAT'u. W obu przypadkach na polskie litery zarezerwowano kody 128-136 (tutaj znajduje się kilka niemieckich liter). Oprócz tego CSK zajął kody 160-168 (dosyć ciekawie) a CYFROMAT 144-152 (tu zniknęła kolejna niemiecka litera).

Od niedawna "mocnym" standardem w internecie jest ISO-8859-2. Standard ten to lekko zmodyfikowany WINDOWS-1250; liczba usuniętych znaczków semigraficznych wzrosła do 9-ciu.

Pozostałe standardy są raczej rzadko używane, więc nie będę ich tutaj opisywał.


3) Czy jest jakaś szansa na poprawę sytuacji?

Obawiam się że nie. Do dzisiaj powstało już ponad 10 standardów - lepszych lub gorszych - lecz każdy następny jest coraz bardziej beznadziejny! Zamiast usuwać niepotrzebne litery (kto w Polsce używa skandynawskich liter?) i na ich miejscu umieszczać polskie ogonki, usuwa się często używane znaczki semigraficzne i litery niemieckie. Poza tym istnieje jakaś dziwna tendencja powstawania nowych standardów wraz z powstawaniem nowych systemów operacyjnych. Dziś użytkownik DOS'a (a na pewno są jeszcze tacy), chcąc przenieść swój tekst do okienkowego Worda, musi za każdym razem konwertować swoje pliki. Niestety...


4) Cóż więc czynić?

Nie pozostaje nam więc nic innego, jak z pokorą przyjmować nowe standardy i korzystać z możliwości przeróżnych konwerterów plików tekstowych. Choć jest ich wiele, postanowiłem sobie napisać jeszcze jeden, który ma dwie duże zalety: jest zupełnie darmowy i daje się uzupełniać o nowe standardy (przecież nikt naprawdę nie wie, czy za miesiąc nie powstanie nowy). Wersja, którą przedstawiam poniżej, została napisana w języku Pascal i obsługuje 8 standardów kodowania polskich liter. Możliwe jest również całkowite usunięcie wszystkich ogonków. Program należy skompilować i od tego momentu można go używać do woli. Standardowo program konwertuje ze standardu Windows-1250 na ISO-8859-2, po użyciu odpowiednich parametrów można używać innych standardów.

W tym miejscu zaznaczę, że artykuł ten napisałem pod DOS'em w standardzie CYFROMAT (to tak dla przekory), później przekonwertowałem za pomocą poniżej przedstawionego programu na Windows-1250, dokonałem poprawek i znów przekonwertowałem, tym razem na ISO-8859-2. Widać więc, że program działa.

Wersja skompilowana programu jest tutaj, poniżej znajduje się listing programu:

PROGRAM PlToPl;

CONST eol = #13+#10;

      pl : ARRAY[0..8,1..18] of BYTE = (

 {Bez PL znakow}(97, 99, 101,108,110,111,115,122,122,65, 67, 69, 76, 78, 79, 83, 90, 90 ),

 {Windows-1250} (185,230,234,179,241,243,156,191,159,165,198,202,163,209,211,140,175,143),

 {ISO-8859-2}   (177,230,234,179,241,243,182,191,188,161,198,202,163,209,211,166,175,172),

 {Mazovia}      (134,141,145,146,164,162,158,167,166,143,149,144,156,165,163,152,161,160),

 {Latin-2}      (165,134,169,136,228,162,152,190,171,164,143,168,157,227,224,151,189,141),

 {DHN}          (137,138,139,140,141,142,143,145,144,128,129,130,131,132,133,134,136,135),

 {Microvex}     (160,155,130,159,164,162,135,145,168,143,128,144,156,165,147,152,146,157),

 {Cyfromat}     (144,145,146,147,148,149,150,151,152,128,129,130,131,132,133,134,135,136),

 {CSK}          (160,161,162,163,164,165,166,167,168,128,129,130,131,132,133,134,135,136));





VAR  c          : CHAR;

     a,b        : TEXT;

     s          : STRING;

     pos,k1,k2  : Byte;

     tmp        : Integer;



FUNCTION GetPos(nr, kod : Byte):Byte;

VAR  l   : Byte;

     f   : Boolean;

Begin

 l:=0; f:=false;

 Repeat

 inc(l);

 IF pl[nr,l]=kod THEN f:=True;

 Until (f=true) OR (l=18);

 IF f=True THEN GetPos:=l ELSE GetPos:=0;

End;





BEGIN

  Assign(a, ParamStr(1));

  Case ParamCount OF

       1 : Begin

           s:=Copy(ParamStr(1), 1, (Length(ParamStr(1))-3))+'bak';

           Rename(a, s);  Reset(a);

           Assign(b, ParamStr(1));

           k1:=1; k2:=2;

           End;



       4 : Begin

           Val(ParamStr(3),k1,tmp); Val(ParamStr(4),k2,tmp);

           Reset(a);

           Assign(b, ParamStr(2));

           End

       Else

       Begin

       WriteLn('PlToPl by Miguel - konwerter Polskich Liter dla czytelnikow magazynu NoName'+eol);

       WriteLn('Uzycie: PlToPl.EXE plik1 plik2 kod1 kod2'+eol+'lub:'+#9+'PlToPl.EXE plik1'+eol);

       WriteLn('plik1'+#9+'- plik zrodlowy'+eol+'plik2'+#9+'- plik wynikowy'+eol);

       WriteLn('kod1'+#9+'- standard pliku zrodlowego'+eol+'kod2'+#9+'- standard pliku wynikowego'+eol);

       WriteLn('Standardy kodowania Polskich Liter:');

       WriteLn('0 -> Brak Polskich Liter'+eol+'1 -> Windows-1250');

       WriteLn('2 -> ISO-8859-2'+eol+'3 -> Mazovia'+eol+'4 -> Latin-2');

       WriteLn('5 -> DHN'+eol+'6 -> Microvex'+eol+'7 -> Cyfromat');

       WriteLn('8 -> CSK');

       WriteLn(eol+'Przyklad: PlToPl.EXE mazovia.txt iso.txt 3 2');

       Halt;

       End;

  End;



  Rewrite(b);



  While NOT EOF(a) do

                   Begin

                   Read(a,c);

                   pos:=GetPos(k1,Ord(c));

                   IF pos=0 THEN Write(b,c) ELSE Write(b,Chr(pl[k2,pos]));

                   End;

  Close(a);Close(b);

END.

5) Zakończenie

Mam nadzieję, że artykuł ten (i oczywiście program) komuś się przydał. Dziś jestem już pewny, że w przyszłości powstanie jeszcze wiele podobnych tekstów, chyba że ktoś się wreszcie pokusi o stworzenie jednego, jedynego na zawsze niezmienialnego i doskonałego standardu kodowania polskich liter.

Czego sobie i Wam, drodzy czytelnicy życzy

MIGUEL


MIGUEL
e-mail: MIGUEL000@priv7.onet.pl
http://republika.pl/miguel000




Ucieczka z piekla - ksiazka on-line

Copyright (c) 1999 - 2000 NoName