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()
вызывается (буквально оператор перед) строка верна (проверяется с помощью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.