macOS 上文件名中的变音符号行为异常

macOS 上文件名中的变音符号行为异常

考虑以下内容,在 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 系统更常用预制字符。)

相关内容