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