Moduł Encode

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Wstęp

Moduł Encode dostarcza nam interfejs łączący łańcuchy Perla z resztą systemu. Łańcuchy te są ciągiem znaków. Perl potrafi reprezentować co najmniej wszystkie znaki zdefiniowane przez Unicode. Tradycyjnie dane w komputerze przechowywane są w 8-bitowych kawałkach zwanych bajtami. Te kawałki często nazywane są oktetami w standardach sieciowych. Perl jest szeroko stosowany do manipulacji danymi wielu rodzajów - nie tylko łańcuchami znaków reprezentującymi ludzki czy komputerowy język, ale także dane binarne, które są reprezentacją maszynową liczb, pikseli w obrazku czy czegokolwiek innego. Kiedy Perl przetwarza dane binarne, programista chce by przetwarzał ciągi bajtów. Nie jest to problemem dla Perla podczas gdy bajt ma 256 możliwych wartości, łatwo jest zmieścić w Perlu wiele większe logiczne znaki.

Encode API

Aby zakodować łańcuch znaków z wewnętrznego formatu Perl'a do konkretnego standardu kodowania i zwrócić ciąg oktetów możemy użyć funkcji encode. I tak na przykład, aby przekonwertować łańcuch do formatu iso-8859-1 możemy użyć następującego kodu: $octets = encode("iso-8859-1", $string);

Aby zdekodować ciąg oktetów przy założonym standardzie kodowania do wewnętrznego formatu Perl'a i w wyniku zwrócić łańcuch należy użyć funkcji decode. Na przykład, aby przekonwertować dane w formacie iso-8859-1 do łańcucha (wewnętrzny format Perl'a) użyjemy kodu: $string = decode("iso-8859-1", $octets);

Istnieje również możliwość bezpośredniego przekonwertowania ciągu oktetów z jednego kodowania do drugiego. Wystarczy, że skorzystamy z funkcji from_to. Zakładając, że w zmiennej $octets mamy dane w kodowaniu iso-8859-1, które chcemy przekodować do cp1250 wystarczy napisać: from_to($octets, "iso-8859-1", "cp1250"); Funkcja from_to zwraca długość wynikowego łańcucha oktetów w przypadku sukcesu lub wartość undef w przypadku niepowodzenia.

Aby ułatwić sobie życie możemy skorzystać z prostszych i krótszych w zapisie funkcji np zamiast: $octets = encode("utf8", $string); możemy zastosować: $octets = encode_utf8($string); Podobnie: $string = decode("utf8", $octets [, CHECK]); osiągniemy stosując funkcję $string = decode_utf8($octets [, CHECK]);

Wypisywanie dostępnych kodowań

Aby otrzymać listę dostępnych i załadowanych kodowań należy użyć następującej funkcji: use Encode; @list = Encode->encodings();

W przypadku kiedy chcemy otrzymać listę zawierającą wszystkie kodowania, włączając te jeszcze nie załadowane, piszemy: @all_encodings = Encode->encodings(":all");

Możemy również podać nazwę konkretnego modułu: @with_jp = Encode->encodings("Encode::JP");

Definiowanie aliasów

Aby ułatwić sobie życie możemy skorzystać z mechanizmu tworzenia nowych aliasów. I tak na przykład, aby dla kodowania iso8859-2 stworzyć alias isopl używamy poniższego kodu: use Encode; use Encode::Alias; define_alias('isopl' => 'iso-8859-2);

Musimy jednak wziąć pod uwagę sytuację, że alias, który chcemy stworzyć może już istnieć. Dlatego, aby wcześniej upewnić się, że taka sytuacja nie ma miejsca, możemy skorzystać z funkcji resolve_alias(): Encode::resolve_alias("latin1") eq "iso-8859-1" # zwróci prawdę Encode::resolve_alias("iso-8859-12") # zwróci fałsz, alias nie istnieje

Enkodowanie przez PerlIO

Jeśli nasz Perl obsługuje PerlIO, możemy wykorzystać to do dekodowania, enkodowania, przekonwertowywania bezpośrednio z pliku i do pliku, korzystając z otworzonych uchwytów. Można to zrobić za pomocą przykładowego kodu: open my $in, "<:encoding(iso-8859-1)", $infile or die; open my $out, ">:encoding(utf8)", $outfile or die; while(<$in>){ print $out $_; }

Może się jednak zdarzyć, że wybrane kodowanie nie jest obsługiwane przez PerlIO. Można to sprawdzić przy pomocy metody perlio_ok jak w przykładzie poniżej: Encode::perlio_ok("hz"); # zwróci fałsz find_encoding("euc-cn")->perlio_ok; # prawda jeśli PerlIO jest dostępny

Dokumentacja

Powyższe informacje są jedynie dużym skrótem i uproszczeniem pełnej dokumentacji modułu Encode. Jednakże znając te podstawy, można zastosować je w wielu codziennych sytuacjach, chociażby parsując strony przy pomocy modułu LWP, a następnie zmieniając kodowanie ich zawartości na docelowo wymagane przez odbiorcę naszej aplikacji. Więcej informacji można znaleźć na stronie http://search.cpan.org/~dankogai/Encode-2.23/Encode.pm.

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.