Я изо всех сил пытаюсь создать имена каталогов, содержащие Unicode. Я нахожусь на Windows XP и Perl Camelbox 5.10.0.
Вплоть до сих пор я привык для use File::Path qw ( make_path )
для создания каталогов - который хорошо работал, до, первый кириллический каталог появился.
Для файлов Win32API::File qw ( CreateFileW )
хорошо работает, если имя файла является закодированным UTF-16LE. Действительно ли там что-то подобно для каталогов? Или возможно параметр для сообщения CreateFileW
создать путь Unicode, если это не существует?
Спасибо,
Nele
Win32.pm предоставляет интерфейс для CreateDirectory
и его друзей:
Win32 :: CreateDirectory (DIRECTORY)
Создает
DIRECTORY
и возвращает истинное значение об успехе. Проверьте$ ^ E
на сбой для получения расширенной информации об ошибках.КАТАЛОГ может содержать символы Юникода за пределами системной кодовой страницы. После создания каталога вы можете использовать
Win32 :: GetANSIPathName ()
, чтобы получить имя, которое может быть передано системным вызовам и внешним программам.
Примечание: Сохраняем это здесь для записи, потому что вы пытались использовать CreateDirectoryW
непосредственно в своей программе.
Чтобы сделать это вручную, импортируйте CreateDirectoryW
, используя Win32 :: API :
Win32::API->Import(
Kernel32 => qq{BOOL CreateDirectoryW(LPWSTR lpPathNameW, VOID *p)}
);
Вам необходимо закодировать $ path
для CreateDirectoryW
:
#!/usr/bin/perl
use strict; use warnings;
use utf8;
use Encode qw( encode );
use Win32::API;
Win32::API->Import(
Kernel32 => qq{BOOL CreateDirectoryW(LPWSTR lpPathNameW, VOID *p)}
);
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
my $dir_name = 'Волгогра́д';
my $ucs_path = encode('UCS-2le', "$dir_name\0");
CreateDirectoryW($ucs_path, undef)
or die "Failed to create directory: '$dir_name': $^E";
E:\> dir 2010/02/02 01:05 PM волгогра́д 2010/02/02 01:04 PM москва