OneDriveに置いた昔書いたテキストファイルが、ビュアーで開くと文字化けする問題。
取り敢えず文字コードをUTF-8にすれば直るので、nkfを使ってドカッと修正。
やり方
1. OneDriveでテキストファイルの有る場所をマウント
- タスクトレイにある OneDrive のアイコンを右クリック。
- 設定
で設定ダイアログを開いて「フォルダーの選択」ボタンをクリック。
マウントしたいフォルダーを選択して「OK」ボタンクリック。
で、マウント先はどこかというと、Windows10の場合、デフォルトはたぶんここ。
C:\Users\%USERNAME%\OneDrive\
%USERNAME% はデフォルトで設定されている環境変数で、ログインユーザー名が入っているはず。
マウント先を確認
DIR C:\Users\%USERNAME%\OneDrive\
自分がマウントしたフォルダーが見えればOK。
2. nkf for windowsを入手
自分でビルドしてもいいけど、めんどくさかったのでVectorから落としてきた。
取り敢えず落としたZipファイルを展開して、出てきた中から nkf32.exe を取り出す。 パスの通ったところに置くか、nkf32.exe をフルパス指定すれば使える。今回は C:\Users\%USERNAME%\Documents に直に置いた。
CD C:\Users\%USERNAME%\Documents DIR nkf32.exe
3. nkfで一括変換
nkfコマンドはファイル名を一つずつ与える必要があるので、FORコマンドでファイル名を取り出してnkf32.exeに一つずつ与えるようにした。 xargsが無いので仕方ない。
変更前確認
FOR /F "tokens=*" %i IN ('DIR /B /S C:\Users\%USERNAME%\OneDrive\*.txt') DO nkf32 -g "%i"
- たぶん Shift_JIS と表示されるファイルが多いはず。
- なお、英数字と記号のみの場合は ASCII と表示され、これは元々文字化けしないので気にしなくていい。
nkfコマンドで置換
- --oc=UTF-8 はUTF-8に変換するためのオプション。
- nkf には -w8 というオプションで UTF-8 にできるんだけど、このオプションを使うとBOM付きのUTF-8になるので --oc= で指定する方(BOMが付かない)を使っている。
- -Lu は改行コードを LF にするオプション
- --overwriteはファイルの上書きオプション。nkfは標準では変換結果を標準出力に出すので、その動作をこのオプションでファイル自体の上書きに変える。
FOR /F "tokens=*" %i IN ('DIR /B /S C:\Users\%USERNAME%\OneDrive\*.txt') DO nkf32 --oc=UTF-8 -Lu --overwrite "%i"
尚、Windowsのプログラム、例えばExcel等では文字コードがUTF-8のファイルでもBOMがついていれば読み込みが可能。 なので、Excelで読み込ませたいcsvファイルなどが有る場合はBOM付きのUTF-8にするという選択も悪くはない。
結果確認
- 変換結果確認。UTF-8 若しくは ASCII になっていれば変換完了。
FOR /F "tokens=*" %i IN ('DIR /B /S C:\Users\%USERNAME%\OneDrive\*.txt') DO nkf32 -g "%i"
- もし変換に失敗していたりしても、OneDriveは履歴機能で前の世代に戻せるので安心。
- おかしなものがあったら手動で戻してください。
おまけ
Windows10でWSLが使える場合はもうちょっと楽ができる。
Ubuntu 18.04 LTS を例にすると
nkfのインストール
sudo apt install nkf
自分はWindowsのログインユーザー名とWSLのログインユーザー名を合わせているのでこんな感じでOKでした。
find /mnt/c/Users/${USER}/OneDrive/ -name "*.TXT" | xargs -n1 -I{} nkf -g {}
find /mnt/c/Users/${USER}/OneDrive/ -name "*.TXT" | xargs -n1 -I{} nkf --oc=UTF-8 -Lu --overwrite {}
find /mnt/c/Users/${USER}/OneDrive/ -name "*.TXT" | xargs -n1 -I{} nkf -g {}
最初からこっちでやればよかった。。。