はじめに
以前改行の文字コードの違いが原因でWindowsで書いたシェルスクリプトがLinuxで動作しなかった。そして原因解決に多大な時間を掛けてしまったという記事を書きました。(その時は改行コードに加えてファイルフォーマットにも問題がありましたが)
以前はVimでsed
を利用して改行コードを置換していましたが、もっと良い方法があることに気が付きました。それはnkf
コマンドです。nkf
コマンドならいちいちVimでファイルを開くことなく変換が出来て、更に改行コードや文字コードの確認も簡単です。
今回は備忘録をかねて頻度の高いnkf
の使用法をまとめておきたいと思います。
符号化文字集合と符号化方式(文字コード)
nkf
コマンドをまとめる前にまずは文字コードへの理解を軽く整理しておきます。
符号化文字集合とはあらゆる文字に対して数字を振って区別するための規格です。キャラクタセットと呼ばれることもあります。「JIS X 0208」とか「Unicode」などがあります。
符号化方式とは符号化文字集合をコンピュータで扱えるように数値変換するための規格です。「JIS X 0208」の符号化文字集合を数値変換するための「Shift-JIS」や、「Unicode」を変換するための「UTF-8」、そして両方に互換性のある「ASCII」などがあります。
nkfで文字コードを確認・変換する
それではnkf
コマンドを実行していきましょう。最初に日本語文字列を含む適当なテキストファイルmojiretu.txtを作成します。日本語を含まない場合nkf
の結果は全て「ASCII」となり違いが分かりません。
文字コードを確認する
$ nkf -g mojiretu.txt
UTF-8
文字コードをShift-JISに変換する。※変換後のファイルを開くとちゃんと文字化けします。
$ nkf -s --overwrite mojiretu.txt
$ nkf -g mojiretu.txt
Shift_JIS
文字コードをUTF-8に変換する。※変換後文字化けが治ります。
$ nkf -w --overwrite mojiretu.txt
$ nkf -g mojiretu.txt
UTF-8
OS毎の改行文字
続いてnkf
で改行を扱ってみましょう。下記は各OSにおける改行コードです。LFはラインフィード、CRはキャリッジリターンと読みます。
OS | 改行コード |
Linux | LF |
Windows | CRLR |
昔のMacなど | CR |
nkfで改行文字を変換する
下記ではWindowsで作成したwindows.txtを扱っています。日本語文字列を含んでいます。
改行コードを確認する。
$ nkf --guess windows.txt
UTF-8 (CRLF)
改行コードをLFに変換する。
$ nkf --Lu windows.txt
$ nkf --guess windows.txt
UTF-8 (LF)
改行コードをCRに変換する。
$ nkf --Lm windows.txt
$ nkf --guess windows.txt
UTF-8 (CR)
改行コードをCRLFに変換する。
$ nkf --Lw windows.txt
$ nkf --guess windows.txt
UTF-8 (CRLF)
終わりに
今の段階では文字コードについて全然理解がなく一先ず扱えるように勉強してみたという状況です。少しずつ知見を深めて何か理解するたびにこの記事を更新していこうかと思います。