SwiftでNFDからNFCへの変換(モバイルでは無く文字のお話です)

広告

Swiftでファイルパスを扱っていたときの事です。
以前からMacでプレイリストを作ると、パスが見つからないって言われることがあります。
原因はMacのファイルシステムとのことです。
Macの内部で使われているのがNFDというタイプ。(UTF8-mac)
Mac以外だと概ねNFCが使われています。(UTF-8)
UTF-8というところからわかると思いますが、ASCIIのみであれば問題は発生しません。
日本語などを使った場合におかしくなります。

どういう風になるかというと、NFDだと濁点や半濁点を1文字として扱います。
例としては、NFCだと「ブ」、NFDだと「フ゛」となります。

この問題はファイルの内容では起きなくファイルパス(ファイル名)で問題が起きます。
内部でファイルパスを取得するとNFDで取得されるので、ファイルに書き出すとNFDのまま書き出されます。
そのため、Mac以外からそのパスへアクセスしようとすると見つからなくなります。

そこでSwiftでどのようにするかというと簡単です。
pathにファイルパスが格納されているとします。
 
path = path.precomposedStringWithCanonicalMapping

これだけです。
これで、NFDからNFCへの変換ができます。

逆に、NFCからNFDにする場合は、
 
path = path.decomposedStringWithCanonicalMapping

です。

ファイルパスも自分で組み合わせてパスを作る分にはNFCで問題ないですが、FileManagerを使ってファイルパスを取得して、その取得したパスをそのまま使うとNFDになりますね。

ファイルパスを扱う場合は気をつける必要がありますね。