Windows (MS-DOS) の文字コードはデフォルトでシフト JIS ですが、最近は UTF-8 を採用している OS やアプリケーションが多くなってきました。たとえば、Cygwin や Linux は UTF-8 ですし、Go 言語や Scala などのプログラミング言語も UTF-8 を採用しています。シフト JIS で書かれた Windows 用のプログラムを Cygwin や Linux に移植する場合、文字コードの変換が必要になります。
Linux には標準で iconv という文字コードを変換するコマンドが用意されていますが、改行コードの変換は行ってくれません。Windows の場合、改行コードは CR+LF ですが UNIX 系の OS では LF だけです。この場合、コマンド tr で CR を削除すれば Windows の改行文字を UNIX に直すことができます。
あとは、iconv と tr をパイプでつないで、tr の結果をファイルにリダイレクトするだけです。
$ iconv -f SJIS -t UTF-8 file1.txt | tr -d \\r > file2.txt
ただし、この方法はちょっと困ることがあります。アスキーコードのバックスラッシュ (0x5c) はシフト JIS では円記号になりますが、上記の方法では 0x5c を UTF-8 の円記号 (0xa5) に変換します。プログラムの場合、0x5c をエスケープシーケンスなど特別な記号に割り当てていることがほとんどなので、0xa5 に変換されるとプログラムは正常に動作しなくなります。
M.Hiroi は Tcl/Tk ミニゲーム集を Linux に移植するとき、これが原因でプログラムが動作せず、しばらくの間悩んでしまいました。まあ、そのほかにも手直しするところがあったので、けっきょく Emacs で置換 (replace-string) しましたが、もっと簡単な方法がありました。それはコマンド nkf を使うことです。nkf は次のコマンドでインストールすることができます。
sudo apt-get install nkf
nkf の基本的な使用方法を示します。
ntf [option] input_file -j : JIS に変換 -e : EUC に変換 -s : シフト JIS に変換 -w : UTF-8 に変換 -Lu : 改行コードを LF に変換 -Lm : 改行コードを CR に変換 -Lw : 改行コードを CR+LF に変換
nkf は入力ファイルの文字コードを自動的に判別するので、文字コードの指定は必要ありません。また、-L オプションで改行コードの変換も指定することができます。nkf は古くからある漢字変換プログラムのようですが、今もメンテナンスされていて、とても便利に使うことができます。メンテナンスされている関係者の皆様に感謝いたします。
以前から仮想マシンで Linux など他の OS を動かすことに興味があったのですが、インストールや設定が面倒なような気がして、なかなか実行に移すことができませんでした。ところが、ドットインストール の ローカル開発環境の構築 によると、VirtualBox と Vagrant を使うと、簡単に仮想マシンで Linux などの OS を動かすことができるようです。
VirtualBox は GNU General Public License で利用できる仮想マシンで、Vagant は仮想マシンに OS のインストールや SSH 接続などの設定を行ってくれるツール (MIT License) です。Vagrant の基本的な使い方はドットインストールの Vagrant 入門 が参考になると思います。
Vagrant は VirtualBox のコマンド (VBoxMange など) を呼び出すので、インストールした VirtulaBox にパスを通すことを忘れないでください。それから、Vagrant は基本的に SSH 接続で仮想マシン上の OS にアクセスするので、SSH クライアントが必要になります。DOS プロンプトで vagrant ssh と入力しても、SSH クライアントがなければ動作しません。M.Hiroi は Cygwin の openssh を使いました。これで DOS プロンプト上で仮想マシンにアクセスすることができます。
実際に試してみたところ、驚くほど簡単に仮想マシン上で Linux の環境を構築することができました。M.Hiroi のパソコンは Windows7 (32 bit) でメモリが 2 GByte しかないので、32 bit OS しか試していませんが、きちんと動作しています。軽量の Linux であれば M.Hiroi の環境でも動作するようなので、今度は Vagrant を使わないで仮想マシンに Linux をインストールして、Linux の環境でプログラミングに挑戦してみようかな、と思っています。