我在OS X上的文件名中遇到了变形金刚(ü字符)的麻烦。我正在从perl脚本创建目录。从概念上讲,我正在做的是:
$NAME = "abcüabc";
$PATH = "/Applications/MyProgram/".$NAME."/";
system('ditto', '--rsrc', $FROMPATH, $PATH . $FILENAME);
这将创建名为"/Applications/MyProgram/abs%9Fabc/"
的文件夹。
任何人都知道如何修复此问题以创建具有正确字符的目录?
答案 0 :(得分:6)
你必须说:
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 0x9F
MacRoman 0x9F ⇒ U+00FC ‹ü› \N{LATIN SMALL LETTER U WITH DIAERESIS}
无论如何,你不能在文件系统中拥有一个字符U + 00FC,因为它会分解为"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/
你可以grab the uniquote program from here。它会告诉你文件中的真实内容。您还可以获得macroman script。
你似乎在你的Perl代码中以某种方式输入了丑陋的旧MacRoman。请转换为Unicode!
% iconv -f MacRoman -t UTF-8 < input > output