你不得不说:
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,因为它分解为 a"u"
后跟"\N{COMBINING DIAERESIS}"
. 你真的在你的 Perl 源代码中输入了 MacRoman 字符吗?但是你这样做了吗?请转换为Unicode!Perl 不知道您的源代码在旧版 MacRoman 中!U+009F 是一个控制代码,意思是“\N{APPLICATION PROGRAM COMMAND}”。
在这里,观看:
% 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程序。它将向您展示文件中的真实内容。您还可以获得宏指令脚本。
您似乎以某种方式在您的 Perl 代码中输入了丑陋的旧 MacRoman。请转换为Unicode!
% iconv -f MacRoman -t UTF-8 < input > output