[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