Умлаутс в именах файлов OS X (perl) - PullRequest
1 голос
/ 26 апреля 2011

У меня проблемы с умлаутами (символ ü) в именах файлов в OS X. Я создаю каталог из сценария perl. Концептуально, что я делаю, это:

$NAME = "abcüabc";
$PATH = "/Applications/MyProgram/".$NAME."/";
system('ditto', '--rsrc', $FROMPATH, $PATH . $FILENAME);

Создает папку с именем "/Applications/MyProgram/abs%9Fabc/".

Кто-нибудь знает, как я могу это исправить, чтобы создать каталог с правильными символами?

1 Ответ

6 голосов
/ 26 апреля 2011

Вы должны сказать:

use utf8;

в вашем источнике Perl, если вы ожидаете, что эти строки будут интерпретироваться как символы вместо двоичных.

% uname -a
Darwin arwen 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386

% cat /tmp/makeit 
use utf8;

$name = "abcüabc";
$path = "/tmp/$name";

mkdir($name,0777) || die "can't mkdir $path: $!";

% perl /tmp/makeit

% ls -dF /tmp/abc*
/tmp/abcüabc/

Видите?Это прекрасно работает, если вы делаете это.


РЕДАКТИРОВАТЬ: Вы используете MacRoman!

% macroman 0x9F
MacRoman 0x9F  ⇒  U+00FC  ‹ü›  \N{LATIN SMALL LETTER U WITH DIAERESIS}

И вы все равно не можете иметь символ U + 00FC в файловой системе, потому что он разлагается до "u", за которым следует "\N{COMBINING DIAERESIS}".Вы действительно вводили символы MacRoman в свой исходный код Perl?Однако вы сделали ТО ?Пожалуйста, преобразуйте в Unicode!Perl не знает, что ваш исходный код находится в устаревшем MacRoman!U + 009F - это управляющий код, означающий «\ N {КОМАНДА ПРОГРАММЫ ПРИЛОЖЕНИЯ}».

Здесь смотрите:

% cat /tmp/makeit
use utf8;

$name = "abcüabc";
$path = "/tmp/$name";

mkdir($name,0777) || die "can't mkdir $path: $!";

% uniquote /tmp/makeit
use utf8;

$name = "abc\N{U+FC}abc";
$path = "/tmp/$name";

mkdir($name,0777) || die "can't mkdir $path: $!";

% uniquote -v /tmp/makeit
use utf8;

$name = "abc\N{LATIN SMALL LETTER U WITH DIAERESIS}abc";
$path = "/tmp/$name";

mkdir($name,0777) || die "can't mkdir $path: $!";

% uniquote -b /tmp/makeit
use utf8;

$name = "abc\xC3\xBCabc";
$path = "/tmp/$name";

mkdir($name,0777) || die "can't mkdir $path: $!";

% perl /tmp/makeit

% ls -Fd /tmp/abc* | uniquote -v
/tmp/abcu\N{COMBINING DIAERESIS}abc/

Вы можете получить Uniquote программа отсюда .Он покажет вам, что на самом деле в файле.Вы также можете получить скрипт macroman .

Кажется, вы как-то ввели в свой Perl-код некрасивый старый MacRoman.Пожалуйста, конвертируйте в Unicode!

% iconv -f MacRoman -t UTF-8 < input > output
...