encode("utf8"
Perl будет использовать стандартные функции ввода-вывода библиотеки C для открытия файлов, и в Windows, где имена файлов изначально Unicode (UTF-16 за кулисами), это означает, что библиотека должна интерпретировать имя файла в этом байтовом интерфейсе как в определенной кодировке.
Вот проблема: выбранная кодировка никогда не является UTF-8 или любым другим UTF. Это кодировка по умолчанию для конкретной локали, известная (вводящая в заблуждение) как кодовая страница ANSI. На западной установке Windows это cp-1252
. В общем, что вы можете узнать, позвонив по номеру Win32::Codepage::get_encoding
.
Таким образом, преобразовав вашу строку в эту кодировку, вы можете получить к ней доступ, используя встроенную поддержку файлов, , пока все символы в пути к файлу находятся на кодовой странице ANSI. Для датчан на западной машине это нормально; для датского на китайском компьютере или наоборот вы всегда получите ошибку «файл не найден».
Так что, если вы хотите поддерживать имена файлов со всеми символами Unicode в Windows, у вас нет другого выбора, кроме как использовать Win32 API вместо этого, как Win32::Unicode::File
. Это не уникально для Perl; другие языки без явной поддержки имен файлов Unicode имеют точно такую же проблему.