【问题标题】:Umlauts in OS X file names (perl)OS X 文件名中的变音符号 (perl)
【发布时间】:2011-08-13 04:58:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 天哪!您正在使用 MacRoman! 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}”。
  • 我不知道为什么,但是 tchrists 的评论非常令人毛骨悚然 =/
  • @JustSid:“令人毛骨悚然”?真的吗?怎么会?当我意识到发生了什么时,我惊呆了。我不明白为什么他会看到%9F 而不是ü,我认为ls 只用于控制字符,而不用于字母。所以我查了一下代码点 U+009F 是什么,果然,它一个控制字符。比我通过macroman 运行它,而ᴇᴜʀᴇᴋᴀ﹗ 我仍在试图弄清楚的是什么邪恶的,邪恶的编辑器默认为 MacRoman 的 OS X 之前的遗留编码。没有什么是默认的。
  • 它没有默认为 MacRoman 编码,但在我切换到它之前,我在 perl 脚本中的 AppleScript 调用没有正确显示变音符号。我想我可能可以切换回源文件的 UTF8 编码并重写 AppleScript 以某种方式工作。 (我正在使用 MacPerl,在尝试了多种调用 AppleScripts 的方法之后,这是最好的)。

标签: macos perl unicode diacritics unicode-normalization


【解决方案1】:

你不得不说:

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

【讨论】:

  • 只是我,还是ü 没有出现在该代码块的最后一行? (它在“编辑”模式预览中显示良好)
  • @Mat:只有你。 :) 这意味着您使用的浏览器(或终端程序)会破坏组合字符。达尔文自动 NFD 的文件名。因此,即使 Perl 代码中有 "abc\N{LATIN SMALL LETTER U WITH DIAERESIS}abc"ls 的输出也是 "/tmp/abcu\N{COMBINING DIAERESIS}abc/"。看出区别了吗?
  • @tchirst:感谢您提供的信息。除了lynx,我所有的浏览器都失败了! Opera 至少试了一下,并在 u 之后显示变音符号 。最好的部分:如果我尝试从 opera 显示的内容复制/粘贴到此窗口(chrome),它会自动恢复为正确的 ü :-))
  • @Mat:那是因为 chrome 在组合字符方面做得很正确。 应该自动把它揉在一起。
  • @tchist:是的,我知道它应该如何工作。只是这种不一致让我觉得有点讽刺。 MacRoman 的好收获。
猜你喜欢
  • 2020-04-30
  • 2018-07-11
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多