Oto prosty skrypt Perla, który ma napisać kodowanie UTF-8 pliku:W jakim kodowaniu readpipe zwraca wynik wykonanego polecenia?
use warnings;
use strict;
open (my $out, '>:encoding(utf-8)', 'tree.out') or die;
print $out readpipe ('tree ~');
close $out;
oczekiwać ja readpipe zwrócić kodowanie UTF-8 znaków od LANG
jest ustawiony na en_US.UTF-8
. Jednak patrząc na tree.out
(upewniając się, że edytor rozpoznaje go jako zakodowany w UTF-8) pokazuje mi cały zniekształcony tekst.
Jeśli zmienię >:encoding(utf-8)
w otwartym rachunku do >:encoding(latin-1)
skrypt tworzy UTF-8 plik z oczekiwaną tekstu.
Wszystko to jest dla mnie trochę dziwne. Jakie jest wytłumaczenie tego zachowania?
Zobacz [Enocde :: Ustawienia regionalne] (https://metacpan.org/pod/Encode::Locale), aby dowiedzieć się, jak włączyć informacje o lokalizacji. Dla bieżącego problemu: 'readpipe' zwraca bajty (które będą już zakodowane jako UTF-8). Warstwa PerlIO '>: encoding (utf-8)' zakoduje ją jeszcze raz podczas drukowania do pliku. Rozwiązanie: Konwertuj ciąg bajtów na ciąg Perla przed wydrukowaniem do pliku. Na przykład, użyj 'Encode :: decode()' –