はじめに
日本語を含むファイル名を作成しており、そのファイル名の長さを知りたい時がありました。(もっといい方法があるかも知れませんが、) wc -m
を使って数えていたところ、濁点・半濁点を含むファイル名だと正しくカウントできていないことが分かりました。調べてみると、NFD正規化されているために、濁点・半濁点を含む文字だと基底文字と結合文字の組み合わせで表現されるため、2 文字扱いになっていることが分かりました。NFC/NFDの違いについては、ファイルアップロードではNFC/NFD問題に気をつけろ!~MacファイルシステムにおけるUnicode正規化の闇~ に書かれていますので、ご参照ください。
そこで、NFD正規化されているファイル名をNFC正規化形式に変換するプログラムを書きました。
環境
- Python 3.10.13
変換プログラムの実装例
参考実装では、プログラムと同じディレクトリに image
フォルダが存在している前提で、そのフォルダ内にある画像を変換します。
標準出力などはさせていないので、何も表示されなければ成功となります。
なお、githubにも上げていますので、適宜ご参照ください。
import os
import unicodedata
dir_path = 'image'
files = os.listdir(dir_path)
for file in files:
nfc_file_name = unicodedata.normalize("NFC", file).encode("utf-8")
os.rename(os.path.join(dir_path, file),
os.path.join(dir_path.encode(encoding='utf-8'), nfc_file_name))