モチベーション

Windowsユーザから送られてきた文字化けしているテキストファイルをMac側で読めるように変更する

WindowsとMacの文字コードの違い

WindowsとMacの文字コードは異なる、そんなのはみんな知っているが恥ずかしながらLinuxコマンドでそれを変換する方法を知らずにいた。Windowsでは様々な文字コードを扱うことができるが、日本語を表現する標準エンコーディングとしてShift-JISが使われている。一方で、Mac OSXではUnicodeが標準だ。当然同じ文字を表すのに用いるビット列は異なる。

また、文字コードだけでなく、改行コードも異なる。WindowではCR+LFが、Mac OSXではLFが使われる。この、CR(キャリッジリターン)とLF(ラインフィード)はタイプライターが使われていた自体に言葉で馴染みがないかもしれない。Wikipediaには以下のように書かれている。

これらの用語はタイプライターが由来である。タイプライターでは印字装置は固定され、紙の方が上下左右に移動することで、文字送りや行送りが行われる。英語などの左横書きにおける「キャリッジリターン」とは、紙を固定して移動する装置(キャリッジ)を元の位置に戻す(リターン、つまり紙の左端に印字装置が来る)ことである。「ラインフィード」とは紙を必要な行(ライン)だけ上に送る(フィード、つまり下の行に印字装置が来る)ことである。

nkfコマンド

さて、文字コードや改行コードの違いを理解した所で、実際に変換してみる。変換にはnkfコマンドを使う。nkfはNetwork Kanji code conversion Filterの略で、ファイルの文字コードを変換するのに利用するコマンド。Shift-JISでエンコードされて送られてきたテキストファイルが文字化けするから、UTF-8に変換したい、などの状況で利用する。

今回は所有しているMacのUTF-8環境に合わせるために以下のコマンドを実行した。

$ nkf -g windows.txt
Shift_JIS
$ nkf -w --overwrite windows.txt
$ nkf -g windows.txt
UTF-8

Shift-JISからUTF-8に文字コードが変換されている。nkfコマンドがインストールされていない時は以下を実行する。

$ brew install nkf

## MacからWindowsにShift-JISエンコーディングで送るには Shift-JISに変換するには以下を実行する。

$ nkf -s example.txt > example-sjis.txt

また、改行コードをWindowsのものに合わせるには以下を実行する。

$ nkf -Lw example.txt > example-win.txt

既存ファイルを上書きしながら同時にエンコーディングと改行をコードをWindowsのものにするには以下を実行する。

$ nkf -s -Lw --overwrite example.txt

fileコマンドでも文字コードの確認は出来る

実はファイルコマンドでも--mimeオプションをつけると文字コードを確認出来る。

$ file --mime example.txt
example.txt: text/plain; charset=us-ascii

まとめ

WindowsでShift-JISでエンコーディングされたテキストファイルの文字コードを変換をした。このくらいサクッと出来ないと恥ずかしいよね。

参考