Чем отличается открытая прагма с разным utf8?

Все эти три версии ведут себя по-разному?

use open qw( :encoding(UTF-8) :std );  
use open qw( :encoding(UTF8) :std );  
use open qw( :utf8 :std );  

2 ответа

Решение

Во-первых, :utf8 только помечает текст как UTF-8, но не проверяет его действительность. Смотрите этот пост на PerlMonks для информации.

:encoding такое уровень расширения для PerlIO, perl perldoc perliol

": кодировка" использовать кодирование; делает этот слой доступным, хотя PerlIO.pm "знает", где его найти. Это пример слоя, который принимает аргумент в том виде, как он называется так: open( $fh, "<: encoding (iso-8859-7)", $ pathname);

Ответы на два других вопроса в FAQ perldoc perlunifaq

В чем разница между ":encoding" и ":utf8"? Поскольку UTF-8 является одним из внутренних форматов Perl, вы часто можете просто пропустить этап кодирования или декодирования и напрямую манипулировать флагом UTF8. Вместо ":encoding(UTF-8)" вы можете просто использовать ":utf8", который пропускает этап кодирования, если данные уже были представлены как UTF8 внутри. Это общепринято как хорошее поведение, когда вы пишете, но это может быть опасно при чтении, потому что это вызывает внутреннюю несогласованность, когда у вас есть недопустимые последовательности байтов. Использование ": utf8" для ввода может иногда привести к нарушениям безопасности, поэтому используйте вместо этого ":encoding(UTF-8)". Вместо "декодировать" и "кодировать" вы можете использовать "_utf8_on" и "_utf8_off", но это считается плохим стилем. Особенно "_utf8_on" может быть опасным по той же причине, что и ": utf8". Есть несколько ярлыков для пользователей; смотрите "-C" в perlrun.

В чем разница между "UTF-8" и "utf8"? "UTF-8" является официальным стандартом. "utf8" - это способ Perl быть либеральным в том, что он принимает. Если вам приходится общаться с вещами, которые не так либеральны, вы можете рассмотреть возможность использования "UTF-8". Если вам приходится общаться с вещами, которые слишком либеральны, вам, возможно, придется использовать "utf8". Полное объяснение в Encode. "UTF-8" внутренне известен как "UTF-8-строгий". Учебное пособие использует UTF-8 последовательно, даже когда utf8 фактически используется внутри, потому что различие может быть трудным сделать, и в большинстве случаев не имеет значения. Например, utf8 можно использовать для кодовых точек, которые не существуют в Юникоде, например 9999999, но если вы кодируете это в UTF-8, вы получите символ подстановки (по умолчанию см. "Обработка искаженных данных" в "Кодировании" для получения дополнительной информации). способы борьбы с этим.) Хорошо, если вы настаиваете: "внутренний формат" - это utf8, а не UTF-8. (Когда это не какая-то другая кодировка.)

open прагма (т.е. use open) только устанавливает слои PerlIO по умолчанию для ввода и вывода; :std делает следующее,

Подпрагма ":std" сама по себе не имеет никакого эффекта, но в сочетании с подпрагмами ": utf8" или ":encoding" она преобразует стандартные файловые дескрипторы (STDIN, STDOUT, STDERR) в соответствие с кодировкой, выбранной для ввода / вывода ручки. Например, если для входа и выхода выбрано значение ":encoding(utf8)", то ":std" будет означать, что STDIN, STDOUT и STDERR также находятся в ":encoding(utf8)". С другой стороны, если выбран только выход для ":encoding(koi8r)", то ":std" приведет к тому, что только STDOUT и STDERR будут в "koi8r". Подпрагма ":locale" неявно включает ":std".

Так :std является подпрагмой (специфичной для open.pm), которая устанавливает стандартные потоки для получения Perl ввода Unicode :utf8 как указано выше.

Эван, кажется, ваш ответ. Для будущего простоты использования см. uft8::all, "включи Юникод - все это".

Другие вопросы по тегам