• Nie Znaleziono Wyników

Narzędzia informatyczne w językoznawstwie Perl - Przetwarzanie plików wielojęzycznych Marcin Junczys-Dowmunt

N/A
N/A
Protected

Academic year: 2021

Share "Narzędzia informatyczne w językoznawstwie Perl - Przetwarzanie plików wielojęzycznych Marcin Junczys-Dowmunt"

Copied!
53
0
0

Pełen tekst

(1)

Narzędzia informatyczne w językoznawstwie

Perl - Przetwarzanie plików wielojęzycznych

Marcin Junczys-Dowmunt junczys@amu.edu.pl

Zakład Logiki Stosowanej http://www.logic.amu.edu.pl

25. marca 2008

(2)

Przetwarzanie wielojęzyczne

I Ostatnio omówiliśmy podstawy dotyczące zestawów znaków oraz kodowań

I Dziś przyjrzymy się przetwarzaniu tekstów w różnych kodowaniach, ich wprowadzaniu oraz wyświetlaniu

I Pytanie podstawowe: Czy do automatycznego przetwarzania tekstów w różnych kodowaniach musimy być w stanie je wyświetlić?

I Odpowiedź: Nie! Postać cyfrowa oraz informacja o użytym kodowaniu są jednoznaczne.

I Dopiero naoczna kontrola narzuca nam konieczność posiadania czcionek, odpowiednich programów itp.

(3)

Przetwarzanie wielojęzyczne

I Ostatnio omówiliśmy podstawy dotyczące zestawów znaków oraz kodowań

I Dziś przyjrzymy się przetwarzaniu tekstów w różnych kodowaniach, ich wprowadzaniu oraz wyświetlaniu

I Pytanie podstawowe: Czy do automatycznego przetwarzania tekstów w różnych kodowaniach musimy być w stanie je wyświetlić?

I Odpowiedź: Nie! Postać cyfrowa oraz informacja o użytym kodowaniu są jednoznaczne.

I Dopiero naoczna kontrola narzuca nam konieczność posiadania czcionek, odpowiednich programów itp.

(4)

Przetwarzanie wielojęzyczne

I Ostatnio omówiliśmy podstawy dotyczące zestawów znaków oraz kodowań

I Dziś przyjrzymy się przetwarzaniu tekstów w różnych kodowaniach, ich wprowadzaniu oraz wyświetlaniu

I Pytanie podstawowe: Czy do automatycznego przetwarzania tekstów w różnych kodowaniach musimy być w stanie je wyświetlić?

I Odpowiedź: Nie! Postać cyfrowa oraz informacja o użytym kodowaniu są jednoznaczne.

I Dopiero naoczna kontrola narzuca nam konieczność posiadania czcionek, odpowiednich programów itp.

(5)

Wyświetlanie danych Unicode

I Warunek konieczny: Posiadamy czcionki Unicode, np.

I Arial Unicode MS (38,917 znaków, freeware)

I Bitstream Cyberbit (32,910 znaków, freeware)

I Code 2000 (51,239 znaków, shareware)

I GNU Unifont (33,580 znaków, GPL)

I New Gulim (46,567 znaków, Microsoft 0ffice 2000)

I ...

I Nie musimy posiadać czcionek, które pokrywają cały Unicode (ok. 100,000 znaków). Wystarczają potrzebne zakresy znaków.

I Np. teksty zapisane w językach europy zachodniej i środkowej prawdopodobnie wyświetlimy za pomocą czcionek

standardowych.

I Nie ma na pewno problemów z umlautami äöüß, są czasami z ogonkami itp. ąęćł...

(6)

Wyświetlanie danych Unicode

I Warunek konieczny: Posiadamy czcionki Unicode, np.

I Arial Unicode MS (38,917 znaków, freeware)

I Bitstream Cyberbit (32,910 znaków, freeware)

I Code 2000 (51,239 znaków, shareware)

I GNU Unifont (33,580 znaków, GPL)

I New Gulim (46,567 znaków, Microsoft 0ffice 2000)

I ...

I Nie musimy posiadać czcionek, które pokrywają cały Unicode (ok. 100,000 znaków). Wystarczają potrzebne zakresy znaków.

I Np. teksty zapisane w językach europy zachodniej i środkowej prawdopodobnie wyświetlimy za pomocą czcionek

standardowych.

I Nie ma na pewno problemów z umlautami äöüß, są czasami z ogonkami itp. ąęćł...

(7)

Edytory tekstów

I Notepad: okazuje się, że ten prosty edytor w pełni współpracuje z Unicodem.

I Zapisuje i wczytuje ANSI (CP-1250 według systemu), UTF-8, Unicode (???)

I Wygląda na to że ISO-8859-2 nie działa

I EmEditor: Zalecam!

I 42 kodowania, w tym rodziny ISO, DOS, Windows CP i różne kodowania Unicode, np. UTF-8, UTF-16, UTF-7 ...

I Algorytmy rozpoznawania kodowania

I Może służyć jako konwerter między kodowaniami (do obsługi ręcznej)

(8)

Edytory tekstów

I Notepad: okazuje się, że ten prosty edytor w pełni współpracuje z Unicodem.

I Zapisuje i wczytuje ANSI (CP-1250 według systemu), UTF-8, Unicode (???)

I Wygląda na to że ISO-8859-2 nie działa

I EmEditor: Zalecam!

I 42 kodowania, w tym rodziny ISO, DOS, Windows CP i różne kodowania Unicode, np. UTF-8, UTF-16, UTF-7 ...

I Algorytmy rozpoznawania kodowania

I Może służyć jako konwerter między kodowaniami (do obsługi ręcznej)

(9)

Wprowadzanie danych Unicode

I Jeśli mamy potrzebne znaki na klawiaturze nie ma problemów.

Program świadomy Unicodu zadba o odpowiednią

reprezentację przy zapisie w odpowiednim kodowaniu, najlepiej w UTF-8

I Jeśli ich nie mamy:

I Zmiana układu i języka klawiatury

I Edycja układu klawiatury: np. Microsoft Keyboard Layout Editor

I Klawiatura ekranowa z odpowiednim układem

I Tablica Znaków

I Kody Alt + Numer znaku (nie działa u mnie, a u Państwa?)

(10)

Wprowadzanie danych Unicode

I Jeśli mamy potrzebne znaki na klawiaturze nie ma problemów.

Program świadomy Unicodu zadba o odpowiednią

reprezentację przy zapisie w odpowiednim kodowaniu, najlepiej w UTF-8

I Jeśli ich nie mamy:

I Zmiana układu i języka klawiatury

I Edycja układu klawiatury: np. Microsoft Keyboard Layout Editor

I Klawiatura ekranowa z odpowiednim układem

I Tablica Znaków

I Kody Alt + Numer znaku (nie działa u mnie, a u Państwa?)

(11)

Wprowadzanie danych Unicode

I Jeśli mamy potrzebne znaki na klawiaturze nie ma problemów.

Program świadomy Unicodu zadba o odpowiednią

reprezentację przy zapisie w odpowiednim kodowaniu, najlepiej w UTF-8

I Jeśli ich nie mamy:

I Zmiana układu i języka klawiatury

I Edycja układu klawiatury: np. Microsoft Keyboard Layout Editor

I Klawiatura ekranowa z odpowiednim układem

I Tablica Znaków

I Kody Alt + Numer znaku (nie działa u mnie, a u Państwa?)

(12)

Wprowadzanie danych Unicode

I Jeśli mamy potrzebne znaki na klawiaturze nie ma problemów.

Program świadomy Unicodu zadba o odpowiednią

reprezentację przy zapisie w odpowiednim kodowaniu, najlepiej w UTF-8

I Jeśli ich nie mamy:

I Zmiana układu i języka klawiatury

I Edycja układu klawiatury: np. Microsoft Keyboard Layout Editor

I Klawiatura ekranowa z odpowiednim układem

I Tablica Znaków

I Kody Alt + Numer znaku (nie działa u mnie, a u Państwa?)

(13)

Wprowadzanie danych Unicode

I Jeśli mamy potrzebne znaki na klawiaturze nie ma problemów.

Program świadomy Unicodu zadba o odpowiednią

reprezentację przy zapisie w odpowiednim kodowaniu, najlepiej w UTF-8

I Jeśli ich nie mamy:

I Zmiana układu i języka klawiatury

I Edycja układu klawiatury: np. Microsoft Keyboard Layout Editor

I Klawiatura ekranowa z odpowiednim układem

I Tablica Znaków

I Kody Alt + Numer znaku (nie działa u mnie, a u Państwa?)

(14)

Wprowadzanie danych Unicode

I Jeśli mamy potrzebne znaki na klawiaturze nie ma problemów.

Program świadomy Unicodu zadba o odpowiednią

reprezentację przy zapisie w odpowiednim kodowaniu, najlepiej w UTF-8

I Jeśli ich nie mamy:

I Zmiana układu i języka klawiatury

I Edycja układu klawiatury: np. Microsoft Keyboard Layout Editor

I Klawiatura ekranowa z odpowiednim układem

I Tablica Znaków

I Kody Alt + Numer znaku (nie działa u mnie, a u Państwa?)

(15)

Tablica Znaków

I Uruchamianie tablicy znaków (character map) w Windows XP

I Uruchom > charmap

I Wszystkie Programy > Akcesoria > Narzędzia systemowe >

Tablica znaków

I Wyświetla znaki dostępne dla wybranej czcionki według danego kodowania

I Opcja zaawansowana: można grupować według zakresów językowych lub tematycznych

I Ważne: W stopce wyświetla kod Unicode danego znaku i jego pełną nazwę, np.

ą : U+0105 - LATIN SMALL LETTER A WITH OGONEK Ä : U+00C4 - LATIN CAPITAL LETTER A WITH DIAERESIS

(16)

Tablica Znaków

I Uruchamianie tablicy znaków (character map) w Windows XP

I Uruchom > charmap

I Wszystkie Programy > Akcesoria > Narzędzia systemowe >

Tablica znaków

I Wyświetla znaki dostępne dla wybranej czcionki według danego kodowania

I Opcja zaawansowana: można grupować według zakresów językowych lub tematycznych

I Ważne: W stopce wyświetla kod Unicode danego znaku i jego pełną nazwę, np.

ą : U+0105 - LATIN SMALL LETTER A WITH OGONEK Ä : U+00C4 - LATIN CAPITAL LETTER A WITH DIAERESIS

(17)

Tablica Znaków

I Uruchamianie tablicy znaków (character map) w Windows XP

I Uruchom > charmap

I Wszystkie Programy > Akcesoria > Narzędzia systemowe >

Tablica znaków

I Wyświetla znaki dostępne dla wybranej czcionki według danego kodowania

I Opcja zaawansowana: można grupować według zakresów językowych lub tematycznych

I Ważne: W stopce wyświetla kod Unicode danego znaku i jego pełną nazwę, np.

ą : U+0105 - LATIN SMALL LETTER A WITH OGONEK Ä : U+00C4 - LATIN CAPITAL LETTER A WITH DIAERESIS

(18)

Tablica Znaków

I Uruchamianie tablicy znaków (character map) w Windows XP

I Uruchom > charmap

I Wszystkie Programy > Akcesoria > Narzędzia systemowe >

Tablica znaków

I Wyświetla znaki dostępne dla wybranej czcionki według danego kodowania

I Opcja zaawansowana: można grupować według zakresów językowych lub tematycznych

I Ważne: W stopce wyświetla kod Unicode danego znaku i jego pełną nazwę, np.

ą : U+0105 - LATIN SMALL LETTER A WITH OGONEK Ä : U+00C4 - LATIN CAPITAL LETTER A WITH DIAERESIS

(19)

Kodowania i Unicode a Konsola

I Z powodów znanych pewnie tylko Micorsoftowi konsola korzysta z innego kodowania niż Windows CP-1250 (na polskich systemach), a mianowicie z CP-852

I Czyli obok ISO-8859-2, Windows CP-1250 pojawia nam się Windows CP-852

I Kodowanie konsoli dotyczy danych wyświetlanych i wprowadzanych w konsoli

I Do wyświetlenia aktualnego kodowania służy komenda chcp (Change Code Page) bez argumentu

I Do zmiany kodowania wykorzystujemy tą samą komendę, np.

I chcp 852 - Windows CP-852 (Latin 2) 6= ISO LATIN 2 (ISO-8859-2)

I chcp 1250 - Windows CP-1250 (europa środkowa)

I chcp 1252 - Windows CP-1252 (europa zachodnia)

I chcp 65001 - UTF-8 (!!!) i nawet działa czasem

(20)

Kodowania i Unicode a Konsola

I Z powodów znanych pewnie tylko Micorsoftowi konsola korzysta z innego kodowania niż Windows CP-1250 (na polskich systemach), a mianowicie z CP-852

I Czyli obok ISO-8859-2, Windows CP-1250 pojawia nam się Windows CP-852

I Kodowanie konsoli dotyczy danych wyświetlanych i wprowadzanych w konsoli

I Do wyświetlenia aktualnego kodowania służy komenda chcp (Change Code Page) bez argumentu

I Do zmiany kodowania wykorzystujemy tą samą komendę, np.

I chcp 852 - Windows CP-852 (Latin 2) 6= ISO LATIN 2 (ISO-8859-2)

I chcp 1250 - Windows CP-1250 (europa środkowa)

I chcp 1252 - Windows CP-1252 (europa zachodnia)

I chcp 65001 - UTF-8 (!!!) i nawet działa czasem

(21)

Kodowania i Unicode a Konsola

I Z powodów znanych pewnie tylko Micorsoftowi konsola korzysta z innego kodowania niż Windows CP-1250 (na polskich systemach), a mianowicie z CP-852

I Czyli obok ISO-8859-2, Windows CP-1250 pojawia nam się Windows CP-852

I Kodowanie konsoli dotyczy danych wyświetlanych i wprowadzanych w konsoli

I Do wyświetlenia aktualnego kodowania służy komenda chcp (Change Code Page) bez argumentu

I Do zmiany kodowania wykorzystujemy tą samą komendę, np.

I chcp 852 - Windows CP-852 (Latin 2) 6= ISO LATIN 2 (ISO-8859-2)

(22)

Unicode a Perl

I W Perlu teoretycznie nie ma problemu z Unicodem, ponieważ wewnętrznie wszystko jest reprezentowane w Unicodzie

I Ale jakie to jest kodowanie? UTF-7, UTF-8, UTF-16 ...?

I Teoretycznie utf8 (nie UTF-8!), a praktycznie coś binarnego

I Załóżmy, że to nieznane nam kodowanie, o którym wiemy, że ładnie działa. Trzeba tylko wszystko do niego sprowadzić.

I Korzystamy z tego kodowanie tylko i wyłącznie wewnątrz programu

(23)

Unicode a Perl

I W Perlu teoretycznie nie ma problemu z Unicodem, ponieważ wewnętrznie wszystko jest reprezentowane w Unicodzie

I Ale jakie to jest kodowanie? UTF-7, UTF-8, UTF-16 ...?

I Teoretycznie utf8 (nie UTF-8!), a praktycznie coś binarnego

I Załóżmy, że to nieznane nam kodowanie, o którym wiemy, że ładnie działa. Trzeba tylko wszystko do niego sprowadzić.

I Korzystamy z tego kodowanie tylko i wyłącznie wewnątrz programu

(24)

Unicode a Perl

I W Perlu teoretycznie nie ma problemu z Unicodem, ponieważ wewnętrznie wszystko jest reprezentowane w Unicodzie

I Ale jakie to jest kodowanie? UTF-7, UTF-8, UTF-16 ...?

I Teoretycznie utf8 (nie UTF-8!), a praktycznie coś binarnego

I Załóżmy, że to nieznane nam kodowanie, o którym wiemy, że ładnie działa. Trzeba tylko wszystko do niego sprowadzić.

I Korzystamy z tego kodowanie tylko i wyłącznie wewnątrz programu

(25)

Unicode a Perl

I W Perlu teoretycznie nie ma problemu z Unicodem, ponieważ wewnętrznie wszystko jest reprezentowane w Unicodzie

I Ale jakie to jest kodowanie? UTF-7, UTF-8, UTF-16 ...?

I Teoretycznie utf8 (nie UTF-8!), a praktycznie coś binarnego

I Załóżmy, że to nieznane nam kodowanie, o którym wiemy, że ładnie działa. Trzeba tylko wszystko do niego sprowadzić.

I Korzystamy z tego kodowanie tylko i wyłącznie wewnątrz programu

(26)

Unicode a Perl

I W Perlu teoretycznie nie ma problemu z Unicodem, ponieważ wewnętrznie wszystko jest reprezentowane w Unicodzie

I Ale jakie to jest kodowanie? UTF-7, UTF-8, UTF-16 ...?

I Teoretycznie utf8 (nie UTF-8!), a praktycznie coś binarnego

I Załóżmy, że to nieznane nam kodowanie, o którym wiemy, że ładnie działa. Trzeba tylko wszystko do niego sprowadzić.

I Korzystamy z tego kodowanie tylko i wyłącznie wewnątrz programu

(27)

Złota zasada numer 1

I Wszystkie dane wejściowe konwertujemy przed

rozpoczęciem przetwarzania z kodowania źródłowego do kodowania wewnętrznego Perla.

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania docelowego.

Dlaczego?

I Nie ma wtedy problemów z wyrażeniami regularnymi

I Działa np. zamiana wielkości liter za pomocą uc i lc

I Konwersja do i z kodowanie wewnętrznego jest prosta

I Inne programy nie rozumieją tego kodowania

(28)

Złota zasada numer 1

I Wszystkie dane wejściowe konwertujemy przed

rozpoczęciem przetwarzania z kodowania źródłowego do kodowania wewnętrznego Perla.

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania docelowego.

Dlaczego?

I Nie ma wtedy problemów z wyrażeniami regularnymi

I Działa np. zamiana wielkości liter za pomocą uc i lc

I Konwersja do i z kodowanie wewnętrznego jest prosta

I Inne programy nie rozumieją tego kodowania

(29)

Złota zasada numer 1

I Wszystkie dane wejściowe konwertujemy przed

rozpoczęciem przetwarzania z kodowania źródłowego do kodowania wewnętrznego Perla.

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania docelowego.

Dlaczego?

I Nie ma wtedy problemów z wyrażeniami regularnymi

I Działa np. zamiana wielkości liter za pomocą uc i lc

I Konwersja do i z kodowanie wewnętrznego jest prosta

I Inne programy nie rozumieją tego kodowania

(30)

Złota zasada numer 1

I Wszystkie dane wejściowe konwertujemy przed

rozpoczęciem przetwarzania z kodowania źródłowego do kodowania wewnętrznego Perla.

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania docelowego.

Dlaczego?

I Nie ma wtedy problemów z wyrażeniami regularnymi

I Działa np. zamiana wielkości liter za pomocą uc i lc

I Konwersja do i z kodowanie wewnętrznego jest prosta

I Inne programy nie rozumieją tego kodowania

(31)

Złota zasada numer 1

I Wszystkie dane wejściowe konwertujemy przed

rozpoczęciem przetwarzania z kodowania źródłowego do kodowania wewnętrznego Perla.

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania docelowego.

Dlaczego?

I Nie ma wtedy problemów z wyrażeniami regularnymi

I Działa np. zamiana wielkości liter za pomocą uc i lc

I Konwersja do i z kodowanie wewnętrznego jest prosta

I Inne programy nie rozumieją tego kodowania

(32)

Złota zasada numer 1

I Wszystkie dane wejściowe konwertujemy przed

rozpoczęciem przetwarzania z kodowania źródłowego do kodowania wewnętrznego Perla.

I Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania docelowego.

Dlaczego?

I Nie ma wtedy problemów z wyrażeniami regularnymi

I Działa np. zamiana wielkości liter za pomocą uc i lc

I Konwersja do i z kodowanie wewnętrznego jest prosta

I Inne programy nie rozumieją tego kodowania

(33)

Złota zasada numer 2

I Poza Perlem wszystkie pliki tekstowe sprowadzamy do kodowania UTF-8 (o ile to możliwe)

Dlaczego?

I UTF-8 jest najbardziej popularnym kodowaniem Unicode (można stosować prawie zamiennie, o ile się pamięta różnicę. Jaka jest różnica?)

I Nie musimy pamiętać w jakim kodowaniu jest dany plik tekstowy (bo to zawsze UTF-8)

I Wszystkie systemy znakowe możemy kodować tym samym kodowaniem, w końcu to kodowanie Unicode.

I Możemy używać dokładnie te same programy do przetwarzania tekstów w różnych językach (ale w tych samym kodowaniu)

(34)

Złota zasada numer 2

I Poza Perlem wszystkie pliki tekstowe sprowadzamy do kodowania UTF-8 (o ile to możliwe)

Dlaczego?

I UTF-8 jest najbardziej popularnym kodowaniem Unicode (można stosować prawie zamiennie, o ile się pamięta różnicę.

Jaka jest różnica?)

I Nie musimy pamiętać w jakim kodowaniu jest dany plik tekstowy (bo to zawsze UTF-8)

I Wszystkie systemy znakowe możemy kodować tym samym kodowaniem, w końcu to kodowanie Unicode.

I Możemy używać dokładnie te same programy do przetwarzania tekstów w różnych językach (ale w tych samym kodowaniu)

(35)

Złota zasada numer 2

I Poza Perlem wszystkie pliki tekstowe sprowadzamy do kodowania UTF-8 (o ile to możliwe)

Dlaczego?

I UTF-8 jest najbardziej popularnym kodowaniem Unicode (można stosować prawie zamiennie, o ile się pamięta różnicę.

Jaka jest różnica?)

I Nie musimy pamiętać w jakim kodowaniu jest dany plik tekstowy (bo to zawsze UTF-8)

I Wszystkie systemy znakowe możemy kodować tym samym kodowaniem, w końcu to kodowanie Unicode.

I Możemy używać dokładnie te same programy do przetwarzania tekstów w różnych językach (ale w tych samym kodowaniu)

(36)

Złota zasada numer 2

I Poza Perlem wszystkie pliki tekstowe sprowadzamy do kodowania UTF-8 (o ile to możliwe)

Dlaczego?

I UTF-8 jest najbardziej popularnym kodowaniem Unicode (można stosować prawie zamiennie, o ile się pamięta różnicę.

Jaka jest różnica?)

I Nie musimy pamiętać w jakim kodowaniu jest dany plik tekstowy (bo to zawsze UTF-8)

I Wszystkie systemy znakowe możemy kodować tym samym kodowaniem, w końcu to kodowanie Unicode.

I Możemy używać dokładnie te same programy do przetwarzania tekstów w różnych językach (ale w tych samym kodowaniu)

(37)

Złota zasada numer 2

I Poza Perlem wszystkie pliki tekstowe sprowadzamy do kodowania UTF-8 (o ile to możliwe)

Dlaczego?

I UTF-8 jest najbardziej popularnym kodowaniem Unicode (można stosować prawie zamiennie, o ile się pamięta różnicę.

Jaka jest różnica?)

I Nie musimy pamiętać w jakim kodowaniu jest dany plik tekstowy (bo to zawsze UTF-8)

I Wszystkie systemy znakowe możemy kodować tym samym kodowaniem, w końcu to kodowanie Unicode.

(38)

Konwersja przy korzystaniu z uchwytów - Warstwy

1 use s t r i c t ;

b i n m o d e( STDIN , " : e n c o d i n g ( u t f8 ) ");

b i n m o d e( STDOUT , " : e n c o d i n g ( u t f8 ) ");

5 b i n m o d e( STDERR , " : e n c o d i n g ( c p 8 5 2 ) ");

o p e n( LOG , " >: e n c o d i n g ( u t f 8 ) ", " log . txt ");

w h i l e( < STDIN >) {

10 my $c1 = s/\ b (\ p { Ll })/uc( $1 )/ eg ;

p r i n t S T D E R R " W $ . p o w i e k s z o n o $c1 l i t e r \ n ";

my $c2 = s/\ b (\ p { Lu })/lc( $1 )/ eg ;

p r i n t S T D E R R " W $ . z m n i e j s z o n o $c2 l i t e r \ n ";

p r i n t $_ ;

15 p r i n t LOG " $ .\ t $ c 1 \ t $ c2 \ n "

}

(39)

Gdy nie ma uchwytów...

I Nasze dane nie zawsze będą pochodzić z plików zewnętrznych czy strumieni standardowych

I Tak samo nie będziemy zawsze zapisywali do plików czy do wyjścia standardowego

I Sytuacje, w których nie możemy korzystać z kodowania za pomocą warstw:

I Komunikujemy się z bazą danych. Odbywa się to za pomocą modułów perlowych (np. DBI). Informacje są zwracane przez funkcje tych modułów jako łańcuchy znakowe.

I Ściągamy strony internetowe za pomocą modułu LWP::Simple. Strony te dostajemy w postaci pojedynczego łańcucha

znakowego.

I Komunikujemy się z innym programem nieperlowym przez specjalny interfejs.

I Korzystamy z Parsera XML napisanego w C++ (np. XML::Expat).

I . . .

(40)

Gdy nie ma uchwytów...

I Nasze dane nie zawsze będą pochodzić z plików zewnętrznych czy strumieni standardowych

I Tak samo nie będziemy zawsze zapisywali do plików czy do wyjścia standardowego

I Sytuacje, w których nie możemy korzystać z kodowania za pomocą warstw:

I Komunikujemy się z bazą danych. Odbywa się to za pomocą modułów perlowych (np. DBI). Informacje są zwracane przez funkcje tych modułów jako łańcuchy znakowe.

I Ściągamy strony internetowe za pomocą modułu LWP::Simple. Strony te dostajemy w postaci pojedynczego łańcucha

znakowego.

I Komunikujemy się z innym programem nieperlowym przez specjalny interfejs.

I Korzystamy z Parsera XML napisanego w C++ (np. XML::Expat).

I . . .

(41)

Gdy nie ma uchwytów...

I Nasze dane nie zawsze będą pochodzić z plików zewnętrznych czy strumieni standardowych

I Tak samo nie będziemy zawsze zapisywali do plików czy do wyjścia standardowego

I Sytuacje, w których nie możemy korzystać z kodowania za pomocą warstw:

I Komunikujemy się z bazą danych. Odbywa się to za pomocą modułów perlowych (np. DBI). Informacje są zwracane przez funkcje tych modułów jako łańcuchy znakowe.

I Ściągamy strony internetowe za pomocą modułu LWP::Simple. Strony te dostajemy w postaci pojedynczego łańcucha

znakowego.

I Komunikujemy się z innym programem nieperlowym przez specjalny interfejs.

I Korzystamy z Parsera XML napisanego w C++ (np. XML::Expat).

I . . .

(42)

Gdy nie ma uchwytów...

I Nasze dane nie zawsze będą pochodzić z plików zewnętrznych czy strumieni standardowych

I Tak samo nie będziemy zawsze zapisywali do plików czy do wyjścia standardowego

I Sytuacje, w których nie możemy korzystać z kodowania za pomocą warstw:

I Komunikujemy się z bazą danych. Odbywa się to za pomocą modułów perlowych (np. DBI). Informacje są zwracane przez funkcje tych modułów jako łańcuchy znakowe.

I Ściągamy strony internetowe za pomocą modułu LWP::Simple.

Strony te dostajemy w postaci pojedynczego łańcucha znakowego.

I Komunikujemy się z innym programem nieperlowym przez specjalny interfejs.

I Korzystamy z Parsera XML napisanego w C++ (np. XML::Expat).

I . . .

(43)

Gdy nie ma uchwytów...

I Nasze dane nie zawsze będą pochodzić z plików zewnętrznych czy strumieni standardowych

I Tak samo nie będziemy zawsze zapisywali do plików czy do wyjścia standardowego

I Sytuacje, w których nie możemy korzystać z kodowania za pomocą warstw:

I Komunikujemy się z bazą danych. Odbywa się to za pomocą modułów perlowych (np. DBI). Informacje są zwracane przez funkcje tych modułów jako łańcuchy znakowe.

I Ściągamy strony internetowe za pomocą modułu LWP::Simple.

Strony te dostajemy w postaci pojedynczego łańcucha znakowego.

I Komunikujemy się z innym programem nieperlowym przez

I Korzystamy z Parsera XML napisanego w C++ (np. XML::Expat).

I . . .

(44)

Gdy nie ma uchwytów...

I Nasze dane nie zawsze będą pochodzić z plików zewnętrznych czy strumieni standardowych

I Tak samo nie będziemy zawsze zapisywali do plików czy do wyjścia standardowego

I Sytuacje, w których nie możemy korzystać z kodowania za pomocą warstw:

I Komunikujemy się z bazą danych. Odbywa się to za pomocą modułów perlowych (np. DBI). Informacje są zwracane przez funkcje tych modułów jako łańcuchy znakowe.

I Ściągamy strony internetowe za pomocą modułu LWP::Simple.

Strony te dostajemy w postaci pojedynczego łańcucha znakowego.

I Komunikujemy się z innym programem nieperlowym przez specjalny interfejs.

I Korzystamy z Parsera XML napisanego w C++ (np.

(45)

Moduł Encode - czyli konwersja łańcuchów znakowych

1 use s t r i c t ;

use E n c o d e qw( e n c o d e d e c o d e _ u t f 8 e n c o d e _ u t f 8 );

o p e n( LOG , " > ", " log . txt ");

5

w h i l e( < >) {

$_ = d e c o d e _ u t f 8 ( $_ );

my $c1 = s/\ b (\ p { Ll })/uc( $1 )/ eg ;

10 p r i n t S T D E R R e n c o d e (" c p 8 5 2 "," $ . pow . $c1 lit .\ n ");

my $c2 = s/\ b (\ p { Lu })/lc( $1 )/ eg ;

p r i n t S T D E R R e n c o d e (" c p 8 5 2 "," $ . zmn . $c2 lit .\ n ");

p r i n t e n c o d e _ u t f 8 ( $_ );

(46)

Wewnętrzne kodowanie znaków a kod programu

1 use s t r i c t ;

b i n m o d e( STDIN , " : u t f 8 "); b i n m o d e( STDOUT , " : u t f8 ");

my $ c o u n t = 0;

5 w h i l e( < >) {

if(/\ x { 0 1 1 9 } \ x { 0 1 0 7 } / ) {

p r i n t " $ . - Z n a l a z \ x { 0 1 4 2 } em "; p r i n t " \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ! \ n ";

$ c o u n t ++;

10 }

}

p r i n t " Z n a l a z \ x { 0 1 4 2 } em \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ";

p r i n t " a \ x { 0 1 7 c } $ c o u n t r a zy \ n ";

I \x{nnnn} jest odpowiednikiem numeru unicodowego U+nnnn

I Istnieje zapis będący odpowiednikiem nazwy znaku?

(47)

Wewnętrzne kodowanie znaków a kod programu

1 use s t r i c t ;

b i n m o d e( STDIN , " : u t f 8 "); b i n m o d e( STDOUT , " : u t f8 ");

my $ c o u n t = 0;

5 w h i l e( < >) {

if(/\ x { 0 1 1 9 } \ x { 0 1 0 7 } / ) {

p r i n t " $ . - Z n a l a z \ x { 0 1 4 2 } em "; p r i n t " \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ! \ n ";

$ c o u n t ++;

10 }

}

p r i n t " Z n a l a z \ x { 0 1 4 2 } em \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ";

p r i n t " a \ x { 0 1 7 c } $ c o u n t r a zy \ n ";

I Istnieje zapis będący odpowiednikiem nazwy znaku?

(48)

Wewnętrzne kodowanie znaków a kod programu

1 use s t r i c t ;

b i n m o d e( STDIN , " : u t f 8 "); b i n m o d e( STDOUT , " : u t f8 ");

my $ c o u n t = 0;

5 w h i l e( < >) {

if(/\ x { 0 1 1 9 } \ x { 0 1 0 7 } / ) {

p r i n t " $ . - Z n a l a z \ x { 0 1 4 2 } em "; p r i n t " \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ! \ n ";

$ c o u n t ++;

10 }

}

p r i n t " Z n a l a z \ x { 0 1 4 2 } em \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ";

p r i n t " a \ x { 0 1 7 c } $ c o u n t r a zy \ n ";

I \x{nnnn} jest odpowiednikiem numeru unicodowego U+nnnn

(49)

Wewnętrzne kodowanie znaków a kod programu

1 use s t r i c t ;

use c h a r n a m e s qw( l a t i n );

b i n m o d e( STDIN , " : u t f 8 "); b i n m o d e( STDOUT , " : u t f8 ");

5 my $ c o u n t = 0;

w h i l e( < >) {

if(/\ N { e w i t h o g o n e k }\ N { c w i t h a c u t e }/) { p r i n t " $ . - Z n a l a z \ x { 0 1 4 2 } em ";

p r i n t " \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ! \ n ";

10 $ c o u n t ++;

} }

p r i n t " Z n a l a z \ N { l w i t h s t r o k e } em \"\ x { 0 1 1 9 } ";

p r i n t " \ x { 0 1 0 7 } \ " a \ x { 0 17 c } $ c o u n t r a zy \ n ";

I W zależności od opcji pragmy charnames możemy korzystać z nazw skróconych lub pełnych (l with stroke, LATIN SMALL LETTER L WITH STROKE)

(50)

Wewnętrzne kodowanie znaków a kod programu

1 use s t r i c t ;

use c h a r n a m e s qw( l a t i n );

b i n m o d e( STDIN , " : u t f 8 "); b i n m o d e( STDOUT , " : u t f8 ");

5 my $ c o u n t = 0;

w h i l e( < >) {

if(/\ N { e w i t h o g o n e k }\ N { c w i t h a c u t e }/) { p r i n t " $ . - Z n a l a z \ x { 0 1 4 2 } em ";

p r i n t " \"\ x { 0 1 1 9 } \ x { 0 1 0 7 } \ " ! \ n ";

10 $ c o u n t ++;

} }

p r i n t " Z n a l a z \ N { l w i t h s t r o k e } em \"\ x { 0 1 1 9 } ";

p r i n t " \ x { 0 1 0 7 } \ " a \ x { 0 17 c } $ c o u n t r a zy \ n ";

I W zależności od opcji pragmy charnames możemy korzystać z nazw skróconych lub pełnych (l with stroke, LATIN SMALL

(51)

Pragma utf8 i jego niebezpieczeństwa

1 use s t r i c t ; use u t f 8 ;

b i n m o d e( STDIN , " : u t f 8 ");

5 b i n m o d e( STDOUT , " : u t f 8 ");

b i n m o d e( STDERR , " : e n c o d i n g ( c p 8 5 2 ) ");

w h i l e( < STDIN >) {

my $c = tr/ ą ć ę ł ń ó ś ż ź Ą Ć Ę Ł Ń Ó Ś Ż Ź / a c e l n o s z z A C E L N O S Z Z /;

10 p r i n t S T D E R R " W $ . z n o r m a l i z o w a ł e m $c z n a k ó w \ n "; p r i n t;

}

I Za pomocą pragmy utf8 możemy stosować bezpiecznie polskie (i wszystkie inne) znakie w kodzie. Nawet w nazwach zmiennych i funkcji.

I Ale program musi być zapisany w kodowaniu UTF-8! Inaczej nie będzie działał.

(52)

Pragma utf8 i jego niebezpieczeństwa

1 use s t r i c t ; use u t f 8 ;

b i n m o d e( STDIN , " : u t f 8 ");

5 b i n m o d e( STDOUT , " : u t f 8 ");

b i n m o d e( STDERR , " : e n c o d i n g ( c p 8 5 2 ) ");

w h i l e( < STDIN >) {

my $c = tr/ ą ć ę ł ń ó ś ż ź Ą Ć Ę Ł Ń Ó Ś Ż Ź / a c e l n o s z z A C E L N O S Z Z /;

10 p r i n t S T D E R R " W $ . z n o r m a l i z o w a ł e m $c z n a k ó w \ n "; p r i n t;

}

I Za pomocą pragmy utf8 możemy stosować bezpiecznie polskie (i wszystkie inne) znakie w kodzie. Nawet w nazwach zmiennych i funkcji.

I Ale program musi być zapisany w kodowaniu UTF-8! Inaczej nie będzie działał.

(53)

Pragma utf8 i jego niebezpieczeństwa

1 use s t r i c t ; use u t f 8 ;

b i n m o d e( STDIN , " : u t f 8 ");

5 b i n m o d e( STDOUT , " : u t f 8 ");

b i n m o d e( STDERR , " : e n c o d i n g ( c p 8 5 2 ) ");

w h i l e( < STDIN >) {

my $c = tr/ ą ć ę ł ń ó ś ż ź Ą Ć Ę Ł Ń Ó Ś Ż Ź / a c e l n o s z z A C E L N O S Z Z /;

10 p r i n t S T D E R R " W $ . z n o r m a l i z o w a ł e m $c z n a k ó w \ n "; p r i n t;

}

I Za pomocą pragmy utf8 możemy stosować bezpiecznie polskie (i wszystkie inne) znakie w kodzie. Nawet w nazwach

Cytaty

Powiązane dokumenty

I Słowo kluczowe sub poprzedza nazwę funkcji, którą ustalamy sami; nazwy powinny kojarzyć się działaniem tworzonej funkcji. I Polecenie return wewnętrz funkcji, natychmiast

◮ Hasz jest strukturą podobną do tablicy, ale zamiast indeksów liczbowych hasz używa kluczy.?. Co to

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 18/24.. póki tablica @pokoj zawiera więcej niż

I Parser strumieniowy udostępnia dane zanim sprawdzi poprawność składniową dokumentu. I Wymagania pamięciowe takich parserów są niskie i możemy przetwarzać wielkie dokumenty

I Cała struktura danych jest przechowywana w pamięci, w przypadku dużych dokumentów XML może to stanowić poważny problem.. Struktura danych może zajmować do 30 razy tyle pamięci

I Tablica składająca się z samych kluczy tego hasza jest tablicą zawierająca tylko niepowtarzające się elementy z @tablica. Marcin Junczys-Dowmunt Narzędzia informatyczne

Najpierw wykonamy nasz program z poziomu wiersza poleceń komendą (o ile znajdujemy się w tym samym katalogu) perl hello.pl. Marcin Junczys-Dowmunt Narzędzia informatyczne

Każde narzędzie informatyczne działające na danych lingwistycznych musi brać pod uwagę następujące aspekty:. ◮ Wielojęzyczność