Perl polskie znaki


(Grzelix) #1

Pisze mały skrypt w perlu i mam problem z podzieleniem wyrazu na litery kiedy występują polskie znaki diaktryczne. Zapisywane są one na 2 bajtach w systemie unicode a metody których ja używam zwracają jeden bajt.

Ma ktoś pomysł co zrobić aby móc podzielić polskie słowa na litery?

Dodatkowo kiedy chcę zamienić poleceniem tr litery (rodzaj kodowania) to polskie znaki np ę zostanie zamienione na dwa znaki (po jednym bajcie) i niewiem jak zrobic by można było zamieniać dowolnie.

Perl - jest językiem, który dopiero poznaje nie mniej programowanie nie jest mi obce.


(Sawyer47) #2

Możesz podać kod?


(Grzelix) #3

Kod wygląda następująco:

while ($string =~/(.)/g) { 

# do something with $1

}

to gdy używam wyrażenia regularnego lub

@chars = split(//, $word);

for($i=0;$i<=$#chars;++$i ){

#do something with @chars[$i]

}

gdy dzielę słowa na znaki i tablicuję W obu przydadkach zwraca mi jeden bajt znaku i wprzypadku znaku diaktrycznego jest to tylko jego połowa. Ogólnie chodzi że chcę sprawdzić czy nie ma dwóch takich samych znaków obok siebie i w przypadku polskiego znaku program zwraca że są to różne znaki bo porównuje po dwa bajty a nie konktretne znaki. polece tr wygląda tak:

$string =~tr/aąbc/vxyz/

i wynikiem tego jest podstawienie za a -> v , a za ą -> xy, zamiast x jak jest zamyśle


(Sawyer47) #4

Jeszcze jest kwestia pod jaką wersję perla piszesz. Z wersji na wersję obsługa Unicode jest zmieniana, zazwyczaj ulepszana :wink:. Ja mam perla 5.10.0, ze starszymi wersjami może być więcej roboty. W każdym bądź razie to powinno działać, SOA#1.

#!/usr/bin/env perl


use strict;

use warnings;

use utf8; # Mówi perlowi, że kod napisany jest w UTF-8. Oczywiście kod źródłowy naprawdę musi być zakodowany w UTF-8


binmode(STDOUT, 'utf8'); # Jeśli chcesz wypisywać łańcuchy znaków w UTF-8


my $string = "Zażółć gęślą jaźn";


print join('-', split(//, $string)), "\n";


$string = "aąbc";

print "Before tr: |$string|\n";

$string =~ tr/aąbc/vxyz/;

print "After tr: |$string|\n";

(Grzelix) #5

Ok po części działa to znaczy kiedy wczytuje dane z pliku ( który też jest kodowany w utf8) to się wysypuje. Czy należy coś dodać do polecenia które odczytuje dane, żeby perl wiedział jak ma zakodowane znaki?

Wersja perla którą używam to 5.10.0

Udało mi się porównać znaki - czyli dobrze je odczytał za pomocą

open(DAT,"<:encoding(utf8)", $data_file) || die("Could not open file!");

tylko teraz przy wypisywaniu pisz cos takiego:

Wide character in print at file.pl line 57, line 5

w linii 57 mam polecenie print natomiast linia 5 pliku wczytywanego jak rozumiem jest ostatnia i nie zawiera polskich znaków.


(Sawyer47) #6

Na to ostrzeżenie: binmode(UCHWYT, 'utf8'); - w moim poście powyżej masz już przykład z STDOUT

Zobacz też tu: http://perldoc.perl.org/open.html


(Grzelix) #7

Faktycznie o to chodziło. Próbowałem kilku sposobów i zakomentował tą linijkę. Teraz działa ok.

Dzięki wielkie za pomoc.