1

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

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

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

任何人都知道如何解决这个问题以创建具有正确字符的目录?

4

1 回答 1

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,因为它分解为 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
于 2011-04-26T18:13:11.050 回答