macOS上のAPFSはUnicode Normalizationを行うのか?

iOS 10.3がリリースされましたが、APFSへの移行が含まれていて話題です。特に文字コード界隈ではHFS+で搭載されていた暗黙のUnicode Normalizationがなくなっている点が指摘されています1

ではmacOSではどうなのでしょうか。SierraならばすでにAPFSを扱うことが出来るので試してみましょう。

% hdiutil create -fs APFS -size 1GB foo.sparseimage
WARNING: You are using a pre-release version of the Apple File System called
APFS which is meant for evaluation and development purposes only.  Files
stored on this volume may not be accessible in future releases of OS X.

You should back up all of your data before using APFS and regularly back up
data while using APFS, including before upgrading to future releases of OS X.

Continue? [y/N] y
created: /Users/naruse/foo.sparseimage
% hdiutil mount /Users/naruse/foo.sparseimage
/dev/disk2              GUID_partition_scheme
/dev/disk2s1            Apple_APFS
/dev/disk2s1s1          41504653-0000-11AA-AA11-0030654 /Volumes/untitled
% touch ガ.test
% cp ガ.test /Volumes/untitled
% ls -1|grep .test|od -tx1
0000000    e3  82  ab  e3  82  99  2e  74  65  73  74  0a
0000014
%  ls -1 /Volumes/untitled|grep .test|od -tx1
0000000    e3  82  ac  2e  74  65  73  74  0a
0000011

カレントディレクトリ (HFS+) では e3 82 ab e3 82 99 と2コードポイントにNFD2されていましたが、APFSでは e3 82 ac と1コードポイントになっていますね。

というわけで、macOS上のAPFSもUnicode Normalizationを行わないという結論でした。AppleもやっとファイルシステムのレイヤーでNormalizationを行うのが愚かな行いだと気付いたようでなによりです。(Foundation APIが正規化を行い続けていることがわかったので、この発言は撤回します。)


  1. http://mjtsai.com/blog/2017/03/24/apfss-bag-of-bytes-filenames/ など

  2. 正確にはNFDとは多少違うのだが