У меня есть внешний модуль, который возвращает мне несколько строк.Я не уверен, как именно возвращаются строки.Я действительно не знаю, как работают строки Unicode и почему.
Модуль должен возвращать, например, чешское слово «být», что означает «быть».(Если вы не видите вторую букву - она должна выглядеть как this .) Если я отображаю строку, возвращаемую модулем, с помощью Data Dumper, я вижу ее как b\x{fd}t
.
* 1007.* Однако, если я попытаюсь напечатать его с
print $s
, я получу предупреждение «Широкий символ в печати», и?вместо ý.
Если я попытаюсь Encode::decode(whatever, $s);
, результирующая строка не может быть напечатана в любом случае (всегда с предупреждением «Широкий символ», иногда с искаженными символами, иногда справа), независимо от того, что я вставил в whatever
.
Если я попытаюсь Encode::encode("utf-8", $s);
, полученная строка МОЖЕТ быть напечатана без проблем или сообщений об ошибках.
Если я использую use encoding 'utf8';
, печать работает без необходимости кодирования /декодирования. Однако , если я использую модуль IO::CaptureOutput
или Capture::Tiny
, он снова начинает выкрикивать "Широкий символ".
У меня есть несколько вопросов, в основном о том, что именно происходит.(Я пытался читать perldocs, но я был не очень мудр от них)
- Почему я не могу напечатать строку сразу после ее получения из модуля?
- Почему можно 'я печатаю строку, расшифрованную как «декодировать»?Что именно "декодировал" сделал?
- Что именно "кодировал" сделал, и почему не было проблем с его печатью после кодирования?
- Что именно
use encoding
делает?Почему кодировка по умолчанию отличается от utf-8
? - Что мне нужно делать, если я хочу печатать скаляры без проблем, даже когда я хочу использовать один из модулей захвата?
edit: Некоторые люди говорят мне использовать -C
или binmode
или PERL_UNICODE
.Это отличный совет.Тем не менее, каким-то образом оба модуля захвата волшебным образом уничтожают UTF8-ность STDOUT.Кажется, это скорее ошибка модулей, но я не совсем уверен.
edit2: ОК, лучшим решением было бы сбросить модули и написать «захват» сам (с гораздо меньшей гибкостью).