У меня есть файл хранения perl, в котором (при дампере с Dumper) есть следующие строки:
my $str1 = "1 = educa\x{c3}\x{a7}\x{c3}\x{a3}o";
my $str2 = "2 = educa\x{e7}\x{e3}o";
Я пытался выработать разумную стратегию для вывода UTF8 (см. Также Perl Encode :: Угадай с подсказками и без них - обнаружение utf8 ).
Позвольте мне продолжить с приведенным выше кодом Perl и получить несколько объявлений:
use 5.18.2;
use Encode qw( encode_utf8 decode_utf8 from_to encode decode);
use Encode::Guess;
use Encoding::FixLatin qw(fix_latin);
sub sayStrings() {
say fixEnc($_[0]);
say fixEnc($_[1],'hint');
say "";
};
sub fixEnc() {
my $data = $_[0];
my $enc = "";
if ($_[1]) {
$enc = guess_encoding($data, qw/utf8 latin-1/);
} else {
$enc = guess_encoding($data);
};
if (!ref($enc)) {
return "ERROR: Can't guess: $enc for $data";
} else {
my $flag1a = utf8::is_utf8($data);
my $flag2a = utf8::valid($data);
$data .= "; encoding: ".$enc->name.", is_utf8=$flag1a, valid=$flag2a";
return $data;
};
};
Теперь на вопросы! Я собираюсь дополнить этот код различными фрагментами.
say "Question 1";
&sayStrings($str1, $str2);
и
use open IO => ':encoding(UTF-8)';
say "raw";
&sayStrings($str1, $str2);
оба дают:
Question 1
1 = educação; encoding: utf8, is_utf8=, valid=1
2 = educa??o; encoding: iso-8859-1, is_utf8=, valid=1
Вопрос 1А: Что use open IO => ':encoding(UTF-8)';
ничего не делает? Я предполагаю, что моя система уже настроена как UTF8. Правильно?
Вопрос 1B: Почему символы в 2 отображаются неправильно? Кодировка определяется правильно, но, может быть, когда строка выводится в UTF, 'çã' становятся символами UTF, о которых система не знает (или их нет)?
Теперь к вопросу 2:
use open IO => ':encoding(UTF-8)',':std';
say "Question 2";
&sayStrings($str1, $str2);
дает:
Question 2
1 = educação; encoding: utf8, is_utf8=, valid=1
2 = educação; encoding: iso-8859-1, is_utf8=, valid=1
Вопрос 2: Почему это заставляет строку latin-1 отображаться корректно, но прерывать строку UTF8? (Т.е. кажется, что при добавлении: std последовательность символов в str1 интерпретируется как latin-1, а не UFT8, см. perl Encode :: Guess с и без подсказок - обнаружение utf8 ). Почему это так?
Вопрос 3:
use open IO => ':encoding(UTF-8)',':std';
say "fix_latin";
&sayStrings(&fix_latin($str1), &fix_latin($str2));
дает
fix_latin
1 = educação; encoding: utf8, is_utf8=1, valid=1
2 = educação; encoding: utf8, is_utf8=1, valid=1
Вопрос 3: я думаю, что fix_latin указывает, что строка - utf8, и поэтому строка печатается правильно. Так что, очевидно, я чего-то не понимаю в том, чтобы подписать строку как utf8 и binmode. Что это?
Большое спасибо!
(П.С. пытался прочитать документы по этому вопросу, но да, пожалуйста, отправьте ссылки, которые объяснят это - в идеале на понятном языке с большим количеством примеров ...)