Thread View: pl.comp.lang.perl
2 messages
2 total messages
Started by yoawaoy
Fri, 07 Jun 2013 13:27
use encoding utf.Czy da się innaczej ?
Author: yoawaoy
Date: Fri, 07 Jun 2013 13:27
Date: Fri, 07 Jun 2013 13:27
46 lines
2519 bytes
2519 bytes
Czy da się zmienić znaki diakrytyczne polskie na duże jeszcze przed encode ?
Jak bym to teraz chciał zrobić wrzucając uc befor encode to literki pl zostały by małymi.
W sumie to tego nie rozumiem działania do końca :wewnętrzne kodowanie mam prawdopodobnie unicode a może latin1 i chyba dlatego muszę wpierw zrobić encode by uc rozpoznawało poprawnie diakrytyki polskie .Czy to poprawny tok myślenia czy nie?
#!/usr/bin/perl -w
use Encode;
#chardet wydaw_file.txt
#wydaw_file.txt: utf-8 (confidence: 0.99)
#file -i wydaw_file.txt
#enca nie zwraca nic
open(DS,"wydaw_file.txt");
while(<DS>){
#przerobienie tekstu na kodowanie wewnętrzne
$line=decode("utf-8",$_);
$upline=uc $line;
lookfor($upline);#Tu nie znajduje słowo POŁOŻNICTWO ,ale znajduje GINEKOLOGIA.Wniosek nie znajduje słów z polskimi znakami diakrytycznymi
#print encode("utf-8",$upline);
$rt=encode("utf-8",$upline);
#Tu w zasadzie cecha tego skryptu,przykladu .Po zakodowaniu na utf-8 da sie zamienic wszystkie litery na polskie.
lookfor($rt);#Tu znajduje wyrazy z polskimi znakami diakrytycznymi
}
sub lookfor
{
my $line=shift;
$line =~ /(POŁOŻNICTWO)/ig;
print "Znaleziono:\|$1\|\n";
}
Re: use encoding utf.Czy da się innaczej ?
Author: Tomasz Konojacki
Date: Mon, 17 Jun 2013 19:50
Date: Mon, 17 Jun 2013 19:50
67 lines
2646 bytes
2646 bytes
Cześć!
yoawaoy@gmail.com wrote:
> Czy da się zmienić znaki diakrytyczne polskie na duże jeszcze przed encode ?
> Jak bym to teraz chciał zrobić wrzucając uc befor encode to literki pl zostały by małymi.
Da się. Problem tkwi w tym, że Perl nie wie jakie jest kodowanie pliku
ze skryptem (traktuje go jako strumień bajtów, a nie tekst w UTF-8).
Musisz mu powiedzieć, że jest inaczej, dodając na początku tego skryptu
następującą dyrektywę:
use utf8;
Gdy tej dyrektywy nie ma, ta linia:
$line =~ /(POŁOŻNICTWO)/ig;
jest źle interpretowana, ponieważ zawiera znaki spoza ASCII które są
interpretowane jako jakieś pozbawione sensu bajty, a nie, tak jak
powinny, jako UTF-8.
$rt=encode("utf-8",$upline);
To właśnie powoduje, że $rt też zawiera strumień bajtów, pozbawiony
flagi UTF-8 i dlatego wtedy to "działa".
Pzdr,
Tomasz
PS. Dobrym zwyczajem jest nieużywanie fileglobowych uchwytów plików.
Czyli zamiast:
open(DS,"wydaw file.txt");
daj:
open(my $ds, "wydaw file.txt");
Podstawowym problemem z tymi pierwszym uchwytem jest to, że jest on
zawsze w globalnym zakresie, z czego mogą wyniknąć różne, dziwne błędy,
na przykład:
sub open_handle {
open (A, '>', 'lol.txt');
}
open_handle;
print A "test";
To nie wyświetli błędu mimo iż wydawałoby się, że A jest lokalne tylko
dla funkcji open_handle. Następujący kod już wywoła błąd:
sub open_handle {
open (my $a, '>', 'lol.txt');
}
open_handle;
print $a "test";
PS2. strict i warnings nie bolą :)
--
"Lisp has all the visual appeal of oatmeal with fingernail clippings
mixed in." - Larry Wall
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads