Electronを使ってMac向けのアプリを開発する時のファイル名の扱いについて (所謂UTF-8-MAC問題)

  • 73
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

以前Nodeで作っていたものをElectronで作り直していて、同じ問題にまたハマったので書いておく。
所謂、UTF-8-MAC問題である。もう遥か昔にNodeでハマった時の記事がある。
node.jsでUTF-8-MACを扱う - joker1007の日記

Macのファイルシステムはファイル名に対してNFDとかいう正規化を行っていて、ファイルシステムにアクセスする時に勝手に変換しやがる仕組みになっている。
このせいで、濁点が入ると急に死ぬとか、本当辛い問題が起きる。何の嫌がらせなんだと……。この世界は文字が8ビットで済む様な国ばっかじゃねえんだよ!
とりあえずMac NFDでググると辛いのは俺だけじゃない気持ちになれる。

で、昔は上で貼ったブログに書いたような方法で解決していたのだが、正直、この解決策は2015年にもなって面倒過ぎるだろと思っていた。
(マジかよーってググって自分の記事が一番上に出てきて、軽く絶望した)

幸いなことにiojsはちゃんとこの問題について認識していたらしく、String.prototype.normalize()なるものが実装されていた。
もちろんElectronでも使える。本当、良かった……。
String.prototype.normalize() - JavaScript | MDN
(なんか、nodeのリポジトリに同種のissueがまだオープンされてるんだが、iojsと統合された後のNodeでちゃんと使えるのか不安……。まだ試してない。)

後、昔は見つけられなかったが、こんなnpmパッケージもあった。
walling/unorm

というわけで、ファイルシステムからfsモジュール等で取ってきたファイル名の文字列を扱う際には、一旦normalize()でNFCに戻しておいた方が安全です。
特にDBに書き込んだり、フォームから入力した文字列と付き合わせる場合です。
でないと、濁音等が混じっただけで、目に見えないけど違う文字扱いされて死にます。

割と簡単に解決できる世の中になってて良かったけど、またiconvをコンパイルしたり、もしくはNFD->NFC変換を自分で書かなきゃいけないのかと絶望する所だった。
もう、El Capitanとかどうでもいいから、NFDを止めて欲しい……。忘れたころに地雷が……。
しかし、実はNode界隈に自分が疎いだけで、JSerにとってはこの問題は常識だったりするのかも。