2011-04-26 41 views
1

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

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

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

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

+3

** OMIGOD!您正在使用MacRoman!** MacRoman 0x9F⇒U + 00FC <ü> \ N {拉丁字母小写字母U}。而且在文件系统中你不能有U + 00FC这个字符,因为它会分解成一个''u'',然后是'\ N {COMBINING DIAERESIS}“。你真的在你的Perl源代码中输入了MacRoman字符吗?但是你做了**那**吗?请转换为Unicode! Perl不知道你的源代码是在传统的MacRoman中! U + 009F是一个控制代码,意思是“\ N {应用程序命令}”。 – tchrist 2011-04-26 19:36:04

+0

我不知道为什么,但tchrists评论是相当令人毛骨悚然=/ – JustSid 2011-04-26 19:55:43

+1

@JustSid:“令人毛骨悚然”?真?怎么来的?一旦我意识到发生了什么事,我就快速成长起来。我无法弄清楚为什么他会看到'%9F'而不是'ü',我认为'ls'只对控制字符,而不是字母。于是我查找了U + 009F的代码点,果然,它*是一个控制字符。而不是我通过[macroman](http://training.perl.com/scripts/macroman)执行它,ᴇᴜʀᴇᴋᴀ!我仍然试图弄清楚什么是邪恶的,邪恶的编辑默认了OS X之前的遗产MacRoman的编码。没有什么应该默认的。 – tchrist 2011-04-26 21:40:26

回答

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 {应用程序命令}”。

这里,看:

% 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 
+0

只是我,还是'ü'没有出现在该代码块的最后一行? (在“编辑”模式预览中显示正常) – Mat 2011-04-26 18:44:38

+1

@Mat:只是你。 :)这意味着你正在使用一个浏览器(或终端程序),它可以将字符组合起来。达尔文自动NFD的文件名。因此,即使Perl代码中含有''abc \ N {放置小字母U DIAERESIS} abc“','ls'的输出是'”/ tmp/abcu \ N {COMBINING DIAERESIS} abc /“'。看到不同? – tchrist 2011-04-26 19:26:39

+0

@tchirst:感谢您的信息。我的所有浏览器除了'lynx'都失败了! Opera至少给它一个镜头,并在u之后显示变音符号。最好的部分是:如果我试图从opera显示的内容复制/粘贴到这个窗口(chrome),它会自动回到正确的'ü':-)) – Mat 2011-04-26 19:45:00