Вы должны сказать:
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