🧊

Macで作ったファイルをrsyncして、Linux上のNodeでファイルパスを扱うとき

に、考慮しておかないと確実にハマること・・。

このあたりがキーワードです。

事の発端

こういう個人で作って使ってるアプリがありまして。

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

これで本当に不便のない最高の環境が整ってしまった・・・!

いちおう原因

  • MacUTF-8UTF-8-MACといって、厳密には違う
  • 内部的な差異としては、NFCWindows/Linux)とNFD(Mac)らしい
    • というかMacのHFS+ってやつがNFD(一部)を使う
    • Windows/Linuxは何もしないのでだいたいNFC
  • とりあえず濁点つきの文字を、文字と濁点に分けて扱うのがMac
  • なのでそれをそのまま使うと、Linuxとかで事故る
    • NFCにしてあげないとダメ