以前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にとってはこの問題は常識だったりするのかも。