2016-01-25 1 views
2

J'ai donc des fichiers texte utf8, que je veux lire, placer les lignes dans un tableau et les imprimer. Mais la sortie cependant n'imprime pas correctement les signes, par exemple la ligne de sortie ressemble à ce qui suit:sortie perl - Echec de l'impression correcte des fichiers texte utf8

« arnÅ¿tein gehört gräflichen »

donc j'ai essayé de tester le script par une ligne, collé directement dans le script Perl, sans le lire à partir du fichier. Et là, la sortie est parfaitement bien. J'ai vérifié les fichiers, qui sont en utf8 unicode. Toujours les fichiers doivent provoquer le problème de sortie (?).

Parce que le script est trop long, je coupe juste jusqu'à la pertinente: (pour accéder au répertoire, ouvre des fichiers, conduit l'entrée à la fonction & align, Anaylse, l'ajouter à un tableau, imprimez le tableau

#!/usr/bin/perl -w 
use strict; 

use utf8; 
binmode(STDIN,":utf8"); 
binmode(STDOUT,":utf8"); 
binmode(STDERR,":utf8"); 

#opens directory 
#opens file from directory 
if (-d "$dir/$first"){ 
    opendir (UDIR, "$dir/$first") or die "could not open: $!"; 
    foreach my $t (readdir(UDIR)){ 
    next if $first eq "."; 
    next if $first eq ".."; 

    open(GT,"$dir/$first/$t") or die "Could not open GT, $!"; 
    my $gt= <GT>; 
    chomp $gt; 

    #directly pasted lines in perl - creates correct output 
    &align("det man die Profeſſores der Philoſophie re- "); 

    #lines from file - output not correct 
    #&align($gt); 
    close GT; 
    next; 

    }closedir UDIR; 
} 

Une idée?

Répondre

3

Vous avez dit à Perl que votre code source était UTF-8, et que STDIN, STDOUT, & STDERR sont UTF-8, mais vous n'avez pas dit que le fichier que vous lisez contient UTF-8.

open(GT,"<:utf8", "$dir/$first/$t") or die "Could not open GT, $!"; 

Sans cela, Perl suppose que le fichier est encodé en ISO-8859-1, puisque c'est le charset par défaut de Perl si vous ne spécifiez pas un autre. Il transcode utilement ces caractères ISO-8859-1 en UTF-8 pour la sortie, puisque vous avez dit que STDOUT utilise UTF-8. Puisque le fichier était en fait UTF-8, pas ISO-8859-1, vous obtenez une sortie incorrecte.

+0

merci, je pensais que "binmode" définirait le flux d'entrée déjà sur utf8 mais évidemment pas :) –

+0

'binmode' définit UTF-8 pour le handle de fichier sur lequel vous l'appelez. Lorsque vous ouvrez explicitement un fichier, son encodage n'a rien à voir avec ce que STDIN ou STDOUT utilise. – cjm