2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Terminal.appで簡単にMac OSのNFDをNFCに書き換える

Last updated at Posted at 2024-08-23

この記事では、特定のディレクトリ以下のファイルがNFDかNFCかを判定するスクリプトと、特定のファイルやフォルダーの名前をNFDに書き換える方法を紹介する。目的はVisual Studio CodeのプロジェクトがあるパスにNFDが含まれているとき、Gitが正しく動作しない問題を回避するためだ。

GitのMac版はユニコードの結合に対応している1のでコマンドラインで使っているとトラブルに出くわすことはそれほど多くない。GitHubに濁点・半濁点を含む日本語名のファイルをアップロードしても、他のプラットフォームではNFCとして扱われるほどだ。しかしVisual Studio Codeは、プロジェクトフォルダーのパスにNFDが含まれていると、ステータスを正しく扱うことができなくなったりしてしまう。

そこで、アドホックな回避策ではあるけど、プロジェクトのルートディレクトリとその上位パスをNFCに書き換えてしまえばいい。というわけだ。

「ファイル名、フォルダ名に日本語を使わない」というよく知られた回避策が何より有効なことは書き添えておく。

NFD検出スクリプト

まず、NFDかどうかを検出するシェルスクリプトを紹介する。

#!/bin/zsh

RED='\033[0;31m'
GREEN='\033[0;32m'
NO_COLOR='\033[0m' 

# NFD形式かどうかをチェックする関数
is_nfd() {
    local filename="$1"
    if [[ "$(echo "$filename" | iconv -f utf-8-mac -t utf-8)" == "$filename" ]]; then
        # ファイル名はNFD形式です。
        return 0
    else
        # ファイル名はNFD形式ではありません。
        return 1
    fi
}

# 引数から対象ディレクトリパスを設定
target_directory="$1"

# 対象ディレクトリが存在しない場合は終了
if [ ! -d "$target_directory" ]; then
    echo "指定されたディレクトリは存在しません: $target_directory"
    exit 1
fi

# 対象ディレクトリ内の全ファイルを処理
find "$target_directory" -maxdepth 1| while read file; do
    # ファイル名を取得
    filename=$(basename -- "$file")
    
    # ファイル名がNFD形式かチェック
    if is_nfd "$filename"; then
        echo -e "${GREEN}[NFC]${NO_COLOR} $file"
    else
        echo "${RED}[NFD]${NO_COLOR} $file"
    fi
done

上記のコードを任意の場所に保存し(以下の例では~/Document/ToolsNFD-detector.shという名前で保存する)、目的のフォルダで以下のように実行する。

% ~/Documents/Tools/NFD-detector.zsh ./

実行すると、以下のような出力が得られる。

[NFC] ./ [NFC] .//従卒トム [NFC] .//.DS_Store [NFC] .//読書家アリス [NFC] .//Three-Light-Year-Solitude [NFD] .//雲をあげる [NFD] .//海はどこにでも [NFC] .//The-Year-of-the-Dragon

NFDをNFCに書き換える

上記の例で「海はどこにでも」フォルダーの下は、VS Codeのソースコードコントロールが機能しない。そこで、このフォルダー名をNFCに書き換える必要がある。Terminal.appやVS Codeのターミナルを起動して、以下のように操作すると、NFDのフォルダー名をNFCに書き換えられる。

% ls -l
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:44 The-Year-of-the-Dragon
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:44 Three-Light-Year-Solitude
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 従卒トム
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 読書家アリス
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 雲をあげる
drwxr-xr-x  2 taiyofujii  staff  64  8 23 10:43 海はどこにでも

##   ↓lsからコピペ(またはコード補完)
% mv 海はどこにでも/ temp
##         ↓ターミナルで日本語入力・変換
% mv temp/ 海はどこにでも

これで「海はどこにでも」がNFCで保存される。Termina.appやVS Codeのターミナルで入力した文字はNFCを使っているためだ。

先ほどの検出スクリプトを使うと結果を確認できる。

[NFC] ./ [NFC] .//従卒トム [NFC] .//.DS_Store [NFC] .//読書家アリス [NFC] .//Three-Light-Year-Solitude [NFD] .//雲をあげる [NFC] .//海はどこにでも [NFC] .//The-Year-of-the-Dragon

これで「海はどこにでも」をVS Codeのプロジェクトフォルダーに設定できる。

今のところ私は大きな問題に突き当たっていないが、ファイル名がASCIIで済むなら、ASCIIを使うようにしよう。

  1. git-config - Get and set repository or global options: core.precomposeUnicode

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?