🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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 ?
#52532
Author: yoawaoy
Date: Fri, 07 Jun 2013 13:27
46 lines
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 ?
#52533
Author: Tomasz Konojacki
Date: Mon, 17 Jun 2013 19:50
67 lines
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