2017-07-01 Macで作ったファイルをrsyncして、Linux上のNodeでファイルパスを扱うとき JavaScript Node.js Mac Linux に、考慮しておかないと確実にハマること・・。 濁点・半濁点 UTF-8-MAC NFC / NFD `rsync --iconv=UTF-8-MAC,UTF-8` `String.prototype.normalize()` このあたりがキーワードです。 事の発端 こういう個人で作って使ってるアプリがありまして。 GitHub - leader22/mmss-client 家にある母艦Macにある`mp3`を、VPSにあるLinuxにバックアップしてる その際、音源と一緒にファイルパスのマッピングを書いたJSONも転送してる そしてその音源を、Nodeで書いたアプリでストリーミングして聞いてる 再生できるものとできないものがある どうやらファイル名にカタカナ + 濁点・半濁点があるとダメらしい 解決策 まずファイルを送る時。 rsync --iconv=UTF-8-MAC,UTF-8 ... `...`は各自の用途に応じて。 重要なのは`--iconv`のオプションを有効にすること。古いバージョンの`rsync`だと使えなかったりするようなので、要確認。次にファイルパスを生成するとき。 'Macで打った濁点つきのカタカナたとえばガギグゲゴ'.normalize(); という感じに、`normalize()`しておく。 引数を空にすると自動的にNFCになる。 String.prototype.normalize() - JavaScript | MDN これで本当に不便のない最高の環境が整ってしまった・・・! いちおう原因 MacのUTF-8はUTF-8-MACといって、厳密には違う 内部的な差異としては、NFC(Windows/Linux)とNFD(Mac)らしい というかMacのHFS+ってやつがNFD(一部)を使う Windows/Linuxは何もしないのでだいたいNFC とりあえず濁点つきの文字を、文字と濁点に分けて扱うのがMac流 なのでそれをそのまま使うと、Linuxとかで事故る NFCにしてあげないとダメ