Как я создаю каталог Unicode в Windows с помощью Perl?

Я изо всех сил пытаюсь создать имена каталогов, содержащие Unicode. Я нахожусь на Windows XP и Perl Camelbox 5.10.0.

Вплоть до сих пор я привык для use File::Path qw ( make_path ) для создания каталогов - который хорошо работал, до, первый кириллический каталог появился.

Для файлов Win32API::File qw ( CreateFileW ) хорошо работает, если имя файла является закодированным UTF-16LE. Действительно ли там что-то подобно для каталогов? Или возможно параметр для сообщения CreateFileW создать путь Unicode, если это не существует?

Спасибо,
Nele

5
задан Nele Kosog 2 February 2010 в 14:29
поделиться

1 ответ

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              москва
6
ответ дан 14 December 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: