Above & Beyond

日々のアウトプット記録

OneDriveに置いたテキストファイルの文字化け

OneDriveに置いた昔書いたテキストファイルが、ビュアーで開くと文字化けする問題。

f:id:kabukawa:20190220161009p:plain:w300

取り敢えず文字コードUTF-8にすれば直るので、nkfを使ってドカッと修正。


やり方


1. OneDriveでテキストファイルの有る場所をマウント

  • タスクトレイにある OneDrive のアイコンを右クリック。
  • 設定

で設定ダイアログを開いて「フォルダーの選択」ボタンをクリック。

f:id:kabukawa:20190220154104p:plain

マウントしたいフォルダーを選択して「OK」ボタンクリック。

f:id:kabukawa:20190220154219p:plain

で、マウント先はどこかというと、Windows10の場合、デフォルトはたぶんここ。

C:\Users\%USERNAME%\OneDrive\

%USERNAME% はデフォルトで設定されている環境変数で、ログインユーザー名が入っているはず。

マウント先を確認

DIR C:\Users\%USERNAME%\OneDrive\

自分がマウントしたフォルダーが見えればOK。


2. nkf for windowsを入手

自分でビルドしてもいいけど、めんどくさかったのでVectorから落としてきた。

www.vector.co.jp

取り敢えず落とした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-8UTF-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 {}

最初からこっちでやればよかった。。。