• 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!
4
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

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 1/16

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.

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 2/16

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. ąęćł...

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 3/16

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)

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 4/16

(2)

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?)

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 5/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

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 6/16

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

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 7/16

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

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 8/16

(3)

Złota zasada numer 1

I Wszystkiedane wejściowe konwertujemy przed

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

I Wszystkiedane wyjściowe konwertujemy po zakończeniu przetwarzaniaz 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

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 9/16

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)

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 10/16

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 "

}

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 11/16

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 . . .

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 12/16

(4)

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 $_ ;

p r i n t LOG e n c o d e _ u t f 8 (" $ .\ t $ c1 \ t $ c2 \ n ");

15 }

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 13/16

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?

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 14/16

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)

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 15/16

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ł.

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 16/16

Cytaty

Powiązane dokumenty

Marcin Junczys-Dowmunt Narzędzia informatyczne w językoznawstwie 11/17.. Aspekt przetwarzania XHTML. I Przeglądarki przetwarzające HTML wewnętrznie korygują błedy

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 Wszystkie dane wyjściowe konwertujemy po zakończeniu przetwarzania z kodowania wewnętrznego Perla do kodowania

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