Unicode は文字合成の仕組みがあり、同じ文字に対して複数の表現が割り当てられる場合もあります。 しかしそれでは何かと不都合なので一貫した表現方法に揃える正規化の規則として以下の四種類を規定しています。
- NFD
- NFC
- NFKD
- NFKC
ただし、これらはソフトウェア内部で文字というものをどう扱うべきかのガイドラインであって、どれかの規則に基づいて正規化しなければならないことを要求するものではありませんし、正規化をしないという選択をしてもかまわないのです。
macOS はファイルシステムが NFD (の変種) を採用しているそうで、ファイル名は NFD になります。 そういう事情があるので他の部分でも NFD を基本にしていたりはするのでしょう。 テキストファイル内の文字列についてであれば、エディタによっては正規化を選択して保存する機能があったりもすると思うのでそういったエディタを探してみてはいかがでしょうか。 (私自身は macOS を使っていないので具体的に提示できないのですが。)
%E3%83%96%E3%82%BF
と %E3%83%95%E3%82%99%E3%82%BF
を同じ文字列とみなさなければならない場面であればそのように処理する機能をソフトウェアに実装しなければなりません。 文字の分解・合成は短いアルゴリズムで表せるものではなく、巨大な表が使われます。 OS / ミドルウェア / ライブラリが上手いこと処理する機能を持っていたりすることが多いので (Unicode で表された) 文字列を扱うプログラムを書く場合には無理して自分で処理しようとせずになるべく OS やミドルウェアの機能を頼るのが望ましいでしょう。