OS X文件名中的变音符号(perl)

时间:2011-04-26 16:42:33

标签: macos perl unicode diacritics unicode-normalization

我在OS X上的文件名中遇到了变形金刚(ü字符)的麻烦。我正在从perl脚本创建目录。从概念上讲,我正在做的是:

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

这将创建名为"/Applications/MyProgram/abs%9Fabc/"的文件夹。

任何人都知道如何修复此问题以创建具有正确字符的目录?

1 个答案:

答案 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!

% 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