IPC::Open3 преобразование кодировки символов

Я наблюдаю странное поведение с аргументами IPC::Open3 как часть сценария.

Я даю строку, содержащую ISO-8859-15. Непосредственно перед вызовом open3() (буквально оператор перед) строка является правильной (проверяется с помощью print а также Data::Dumper).

Однако, как только подпроцесс запущен, аргументы теперь кодируются в UTF-8. Я проверил это, используя нужный исполняемый файл (freebcp) и скрипт-обертку. В итоге я написал скрипт-обертку, который преобразует все аргументы обратно в ISO-8859-15.

Что вызывает это поведение? LANG установлен на en_AU.ISO-8859-15. Он работает правильно на других хостах. Я не могу найти ссылку на binmode()

1 ответ

Решение

У меня есть строка, содержащая ISO-8859-15. Как раз перед open3() вызывается (буквально оператор перед) строка верна (проверяется с помощью print а также Data::Dumper).

Однако, как только подпроцесс запущен, аргументы теперь кодируются в UTF-8.

LANG установлен на en_AU.ISO-8859-15.

Perl5 по умолчанию не выполняет преобразование кодировки: строки обрабатываются как немые байтовые массивы.

До тех пор, пока вы не скажете Perl, что строки содержат Unicode, например, вызвав decode() или чтение строки из дескриптора файла, к которому прикреплен слой кодирования (через binmode() или через open() флаги или через use open с :encoding / :locale или через командную строку с -C переключатель.)

Поскольку у вас есть строка в ISO-8859-15, но она выводится в UTF-8, это означает, что Perl знает о кодировании вашей строки. Где-то вы как-то сказали Perl кодировку строки, и он преобразовал ее в Unicode, который внутренне представлен с использованием UTF-8. UTF-8, который теперь, кажется, печатается на open3() файловые дескрипторы.

Как возможное решение, перед выводом строк вы должны попытаться явно преобразовать строки в желаемую кодировку.

PS Использование utf8::is_utf8() функция, вы можете попытаться отладить / найти, когда / как ваши строки конвертируются в Unicode, и действительно ли они Unicode.

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