[Italia-pm] Bug nel modulo Encode::GSM0338 ?
Guido Brugnara
gdo at leader.it
Sun Feb 25 02:43:31 PST 2018
----- Il 24-feb-18, alle 21:08, Guido Brugnara gdo at leader.it ha scritto:
> Nell'utilizzare il modulo Encode::GSM0338 ho riscontrato che se si codifica il
> carattere "@" (code 0x00) la conversione da "gsm0338" non è corretta.
> Nella documentazione infatti c'è scritto:
> "Mapping \x00 to '@' causes too much pain everywhere"
>
> Quale alternativa potrei utilizzare che non sia bacata come Encode::GSM0338?
In attesa di una soluzione più pulita ho escogitato un work-around:
use utf8;
my $gsm0338 = 'test ..@@@€..';
my $out;
while(1){
my $zpos = index $gsm0338, "\0";
if($zpos == -1){
$out .= decode('gsm0338', $gsm0338);
last;
}else{
my $left = substr $gsm0338, 0, $zpos;
$out .= decode('gsm0338', $left).'@';
$gsm0338 = substr $gsm0338, $zpos + 1;
}
length($gsm0338) || last;
}
print $out,"\n";
bye
gdo
>
> bye
> gdo
>
> NOTE: Usando questo codice di esempio
> ___________________________________________
> #!/usr/bin/perl
>
> use Encode qw/encode decode/;
>
> sub Ord {
> my $str = shift;
> my @list;
> for my $c (split //, $str) { push @list, ord($c); }
> return join ' ', @list;
> }
>
> sub Test {
> my($mess, $str) = @_;
> my $gsm0338 = encode('gsm0338', $str);
> print "$mess\nencode('gsm0338', '$str') --> ".Ord($gsm0338)."\n";
> print "decode('gsm0338', encode('gsm0338', '$str')) --> '".decode('gsm0338',
> $gsm0338)."'\n\n";
> }
>
> Test 'Con il solo carattere @ tutto ok:', '@';
>
> Test 'Con due caratteri @, ritorna una stringa vuota', '@@';
>
> Test 'Se dopo il singolo carattere @ segue un carattere normale tutto ok',
> 'a at b';
>
> Test 'Se dopo il singolo carattere @ segue un carattere speciale la
> riconversione è errata', 'a@|€';
> ___________________________________________
>
> ... ottengo l'output:
> ___________________________________________
> Con il solo carattere @ tutto ok:
> encode('gsm0338', '@') --> 0
> decode('gsm0338', encode('gsm0338', '@')) --> '@'
>
> Con due caratteri @, ritorna una stringa vuota
> encode('gsm0338', '@@') --> 0 0
> decode('gsm0338', encode('gsm0338', '@@')) --> ''
>
> Se dopo il singolo carattere @ segue un carattere normale tutto ok
> encode('gsm0338', 'a at b') --> 97 0 98
> decode('gsm0338', encode('gsm0338', 'a at b')) --> 'a at b'
>
> Se dopo il singolo carattere @ segue un carattere speciale la riconversione è
> errata
> encode('gsm0338', 'a@|€') --> 97 0 27 64 27 101
> Wide character in print at test.pl line 17.
> decode('gsm0338', encode('gsm0338', 'a@|€')) --> 'a@ ¡€'
> ___________________________________________
>
> Da cui si vede bene che la codifica inversa non funziona.
More information about the Italia-pm
mailing list