Hier ist ein einfacher Perl-Skript, das eine utf-8-codierte Datei schreiben sollte:In welcher Codierung gibt Readpipe das Ergebnis eines ausgeführten Befehls zurück?
use warnings;
use strict;
open (my $out, '>:encoding(utf-8)', 'tree.out') or die;
print $out readpipe ('tree ~');
close $out;
I readpipe erwartet habe einen utf-8 kodierten String zurück, da LANG
-en_US.UTF-8
gesetzt. Wenn man jedoch auf tree.out
schaut (während man sicherstellt, dass der Editor es als utf-8-kodiert erkennt), zeigt es mir allen verstümmelten Text an.
Wenn ich die >:encoding(utf-8)
in der Open-Anweisung zu >:encoding(latin-1)
ändern, erstellt das Skript eine utf-8 Datei mit dem erwarteten Text.
Das ist alles ein bisschen seltsam für mich. Was ist die Erklärung für dieses Verhalten?
Siehe [Enocde :: Locale] (https://metacpan.org/pod/Encode::Locale) für das Einbinden von Gebietsschemainformationen. Für Ihr aktuelles Problem: 'readpipe' gibt Bytes zurück (die bereits codiert sind) als UTF-8). PerlIO-Layer '>: encoding (utf-8)' wird es erneut kodieren, wenn Sie es in Datei drucken. Lösung: Konvertieren Sie die Byte-Zeichenfolge vor dem Drucken in die Datei in eine Perl-Zeichenfolge. Verwenden Sie zum Beispiel 'Encode :: decode()' –