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