Polskie Znaki

Perl FAQ | RecentChanges | Preferences

1. Jak uaktywnić polskość?
2. Jak sortować z polskimi znakami?
3. Jak zmienić wielkość liter?
4. Jak poprawić polskie znaki?
5. Jak odkodować polskie znaki?

1. Jak uaktywnić polskość?

Generalnie perl jest przystosowany do obsługi polskich znaków. By tę obsługę uaktywnić wystarczy zawrzeć w kodzie linijkę (opis: perldoc locale):

 use locale;

W niektórych systemach może to nie wystarczyć trzeba wówczas dodać linie:

 #use POSIX qw(locale_h);    # linia potrzebna przy trzeciej linii
 use POSIX qw(setlocale);
 #setlocale(LC_ALL,"pl_PL.iso88592");
 setlocale(&POSIX::LC_ALL,"pl");  # drugi argument w zaleznosci od systemu

gdy i to nie pomaga, trzeba zapoznać się z wynikiem komendy man perllocale. Jeśli skrypt w Perlu po ustawieniach zgodnie z manualem nadal nie daje satysfakcjonujących rezultatow istnieje możliwość, że jest to wina systemu operacyjnego (np. windows, HP-UX). Należy wówczas go poprawić, lub tworzyć własne procedury.

Nieuaktywnienie polskich znaków może skutkować błędnym działaniem niektórych funkcji np. liczących liczbę wyrazów, znaków, sortujących itp.

Obecnie wchodzi również standard Unicode wraz z odpowiednimi modułami, na przykład do konwersji jest Unicode::Map:

 use Unicode::Map();
 use Unicode::String qw(utf8 utf16);

 # Budujemy sobie obiekt do wypluwania wyniku
 $str_latin2 = new Unicode::Map("ISO-8859-2");

 $result = "tekst w UTF-8";
 $result = utf8($result);
 $result = $str_latin2->from_unicode($result->utf16);

Inny sposób:

 use Unicode::MapUTF8 qw(to_utf8 from_utf8);
 $txt = to_utf8( { -string => $txt, -charset => 'ISO-8859-2' } );
 $txt = from_utf8( { -string => $txt, -charset => 'ISO-8859-2' } );

Alternatywą może być Encode lub Text::Iconv.

2. Jak sortować z polskimi znakami?

Do sortowania tablic służy funkcja sort (perldoc -f sort). Jako drugi argument można podać jej funkcję sortującą wprost kod lub referencję. Po uaktywnieniu polskości funkcja sort powinna uwzględniać polskie znaki, co sprawdzamy:

 print +(sort grep /\w/, map { chr() } 0..255), "\n";

Sortowanie polskie można również uzyskać stosując (linia podzielona ze względu na czytelność):

 $literki=join('',0..9,"A\241BC\306\DE\312",F..L,"\243MN\321O\323PQRS\246",
              T..Z,"\254\257_a\261bc\346de\352",f..l,"\263mn\361o\363pqrs\266",
              t..z,"\274\277");
 @posortowane = sort cowieksze @niesortowane;

 sub cowieksze {
  @aa=split //,$a;
  @bb=split //,$b;
  while($aa[0] eq $bb[0] && $#aa+$#bb>=0) {shift @aa; shift @bb;}
  return index($literki,$aa[0]) <=> index($literki,$bb[0]);
 }

3. Jak zmienić wielkość liter?

Do zamiany liter wielkich na małe w zmiennej służy funkcja lc, a odwrotnie uc. Bez polskich liter pierwsza jest równoważna wyrażeniu

 tr/[A-Z]/[a-z]/;

zaś po użyciu locale (przy założeniu standardu ISO)

 tr/[A-Z]/[a-z]/;
 tr/\241\306\312\243\321\323\246\257\254/\261\346\352\263\361\363\266\277\274/;

Do zamiany tylko pierwszej litery na wielką jest funkcja lcfirst, odwrotnie ucfirst.

4. Jak poprawić polskie znaki?

Problem zazwyczaj dotyczy wpisywania znaków w standardzie CP1250, zamiast ISO. Najprostszy sposób to zamiana polskich Ą, Ś, Ź, ą, ś, ź (w całym pliku lub ciągu znaków [napisie]):

 perl -pi -e 'tr/\245\214\217\271\234\237/\241\246\254\261\266\274/' plik
 $napis =~ tr/\xA5\x8C\x8F\xB9\x9C\x9F/\xA1\xA6\xAC\xB1\xB6\xBC/;

Do pozbycia się ogonków służy formuła:

 tr/ąćęłńóśźżĄĆĘŁŃÓŚŹŻ/acelnoszzACELNOSZZ/

lub para:

 tr/\241\306\312\243\321\323\246\257\254/ACELNOSZZ/;
 tr/\261\346\352\263\361\363\266\277\274/acelnoszz/;

Ogólnie zmianę kodowań załatwia moduł Encode.

Wykaz polskich kodowań (wartości numeryczne znaków) jest pod adresem

http://www.ogonki.agh.edu.pl/plchars.html

Konwersja z UTF jest w dziale o aktywowaniu polskości.

5. Jak odkodować polskie znaki?

Problem występuje głównie przy czytaniu poczty. Zaleca się korzystanie z modułu do czytania poczty.

 use MIME::Words qw(:all);
 $decoded = decode_mimewords("wyb=?iso-8859-2?Q?=F3r zespo=B3?=u");

Perl FAQ | RecentChanges | Preferences
This page is read-only | View other revisions (diff)
Search:
Strona znajduje się na serwerze KT AGH.