考虑以下内容,在 macOS 上的终端上运行:
> touch ä
> ls
ä
> ls *
ä
> ls * | hexdump
00000000 c3 a4 0a
00000003
> ls | hexdump
00000000 61 cc 88 0a
00000004
在命令行上扩展*
会导致文件名正常扩展,并具有正常的 UTF-8 字符值。但是,当ls
检索当前目录中的文件名而不将其作为参数提供给它时,由于难以理解的原因,该ä
字符现在已转换为a
带有 UTF-8 组合变音符号的字符。有人知道为什么会这样吗?
这有点问题,因为解析目录中文件名的程序会看到完全相同的差异。
答案1
macOS 适用Unicode 规范化到文件名;这样做是为了让程序无论使用组合形式还是分解形式,总能找到完全相同的文件。
不同寻常的是,采用 HFS+ 文件系统的 macOS 使用 NFD 规范化,它总是分解将字符分为基本字符+组合变音符号。
(在新的 APFS 中,使用了相反的 NFC 格式以实现更好的兼容性,因为非 macOS 系统更常用预制字符。)