Beat: Change Encoding (Bitte u Code Reveiw)

Beitrag lesen

Ich bitte um eine Code Review.

Die Aufgabe ist, das Encoding einer Liste von Files zu ändern.

Zwei Encoding-Transformationen sollen unterstützt werden:

von ISO-8859-X nach UTF-8
von UTF-8 nach ISO-8859-X

Der vorliegende Code wurde aus dem bestehenden programm "as is" kopiert.
Ein paar Kommentare sollen den Inhalt der Variablen zusätzlich erläutern.

Die Prüfung der Übergabeparameter ist bereits erfolgt.

  
    use Encode::Guess;  
prt('c','<h4>Konversion von Files in <var class="dir">userdata</var></h4>',  
    '<p>von Charset: '. $User{multipart}{encode}[0].' nach '.$User{multipart}{encode}[1].'</p>');  
  
my($ntf,$urf,$pf)=('','','');  
  
foreach( keys %{ $Store->{userfile} } ){  
  
	#scheide non text Files aus.  
	$Store->{userfile}{$_}{stat2} eq 'text'  
		or $ntf.= '<li>'.$Store->{userfile}{$_}{path}.'</li>'  
		and next;  
  
	#scheide Files aus, die ungenügende Rechte besitzen  
	$Store->{userfile}{$_}{stat1} < 6  
		and $urf.= '<li>'.$Store->{userfile}{$_}{path}.'</li>'  
		and next;  
  
	my $file;  
	open( my $rfh, '<', $Store->{userfile}{$_}{path} ) or die("Encoding Conversion: $!");  
# slurpmode  
	{  
		local $/ = undef;  
		$file = <$rfh>;  
	}  
	close $rfh;  
	# sortiere Ascii-Files aus.  
	$file =~ /[\x80-\xff]/  
		or $pf .= '<li>'.$Store->{userfile}{$_}{path}.'<br>ist in ASCII (keine Konvertierung)</li>'  
		and next;  
# Frage: ist die obige Prüfung statthaft unter der Erwartung  
# dass nur UTF-8 oder Iso Encodings erwartet / unterstützt werden?  
  
# $User{multipart}{encode}[0] enthält Quellencoding  
# $User{multipart}{encode}[1] enthält Zielencoding  
	my $guess = guess_encoding($file, $User{multipart}{encode}[0], $User{multipart}{encode}[1]);  
	ref($guess) #Scalar bei Fehler mit Fehlermessage  
		or $pf .= '<li>'.$Store->{userfile}{$_}{path}.'<br> ERROR:'.$guess.'</li>'  
		and next;  
	my $guess_decoded = $guess->decode($file);  
	my $decoded = decode( $User{multipart}{encode}[1], $file);  
  
# stelle fest, ob ein File bereits im Zielencoding kodiert ist.  
	$guess_decoded eq $decoded  
		and $pf .= '<li>'.$Store->{userfile}{$_}{path}.'<br> ist bereits im Ziel-Encoding.</li>'  
		and next;  
# Nun sollten nur noch Files vorhanden sein, die  
# im Quellencoding sind und nicht ASCII Textfiles sind  
	open( my $wfh, '>:encoding('.$User{multipart}{encode}[1].')', $Store->{userfile}{$_}{path} ) or die("Encoding Conversion: $!");  
	print $wfh $guess_decoded;  
	close $wfh;  
}  
  
# Protokoll  
$ntf and prt('c','<h5>Keine Textfiles</h5>','<ul>',$ntf,'</ul>');  
$urf and prt('c','<h5>Ungenügende Rechte</h5>','<ul>',$urf,'</ul>');  
$pf and prt('c','<h5>Behandelte Files</h5>','<ul>',$pf,'</ul>');  
  

Zusammenfassend:
Ich lasse mit guess() raten, welches Encoding voriegt. Ist es bereits im Zielencoding (ermittle ich durch explizites decode ) kann ich das File überspringen.
Wenn guess keinen Fehler berichtet hat es andernfalls nun das Quellencoding geraten.
Auf diese Files kann ich nun die gewünschte Konversion anwenden.

Das ganze scheint etwas umständlich. Ich habe aber nichts besseres gefunden.

mfg Beat

--
><o(((°>           ><o(((°>
   <°)))o><                     ><o(((°>o
Der Valigator leibt diese Fische