改行は Windows上ではCR LF(0D,0A)であり、Unix/LinuxなどではLF(0A)となっており、改行が異なった実装になっている。
CR は
carriage return, LFはline feed (または NL new line)のことである。
そして、この改行コードの違いが、色々な問題を引き起こす。
よくある例は、Unixのサーバで作られたテキストデータファイルを受け取って、Windowsのアプリに読みこもうとすると読み込んでくれない。
テキストを見る限り、正しいはずなのだが。。。。。。と悩んだりすることが多々ある。
こういうとき、テキストの16進数ダンプを利用しないといけない。
Windows上では、こういう基本的なことが次第にやりにくくなっているので、説明はUnix/Ubuntu の場合について行う。
テキストエディタで簡単なテキストファイルをつくり、ダンプしてみた。
$ cat HelloNL.txt
Hello
NL
$ od -ctx1 HelloNL.txt
0000000 H e l l o \n N L \n \n
48 65 6c 6c 6f 0a 4e 4c 0a 0a
改行は、 \n(0a) になっており、このままでは Windows側では正しく改行を処理できない可能性があり、改行コードを変換しないといけない。
こういうとき様々な方法が可能なのだが、わかりやすい方法だけを紹介しよう。
以上は、 Unix上での改行変換だが、unixタイプの改行をwindowsタイプにする簡単な方法がある。
> more < HelloNL.txt > HelloCRLF.txt
ほとんどコロンブスの卵みたいな方法(トリック)である。
Windows上で、Unixタイプの改行コードにする単純な方法は知らないのだが、そのような改行変換はUnix側でやったほうが楽なので、無くてもよいかもしれない。
まずは、nkf を使う方法。
nkf は、network kanji filter のことであり、オンラインマニュアルでは、次のように出る。
だだし、長いので、必要になる一部だけを示す。
$ man nkf
nkf(1) nkf(1)
NAME
nkf - ネットワーク用漢字コード変換フィルタ
・・・・・・・ 中略 ・・・・・・
-L[uwm] -d -c
改行コードを変換する。
-Lu -d
unix (LF)
-Lw -c
windows (CRLF)
-Lm mac (CR)
デフォルトでは変換しない。
-Luで \n, -Lwで\r\n となる。
$ nkf -Lw HelloNL.txt | od -ctx1
0000000 H e l l o \r \n N L \r \n \r \n
48 65 6c 6c 6f 0d 0a 4e 4c 0d 0a 0d 0a
なお、nkfは標準ではないので、自分でインストールすることになるだろう。
perl での置き換えもわかりやすいだろうか。
$ perl -p -e 's/\n/\r\n/' HelloNL.txt | od -ctx1
0000000 H e l l o \r \n N L \r \n \r \n
48 65 6c 6c 6f 0d 0a 4e 4c 0d 0a 0d 0a
この他に、unix2dos, dos2unix でも変換可能なのだが、説明は省略する。
以上は、 Unix上での改行変換だが、unixタイプの改行をwindowsタイプにする簡単な方法がある。
> more < HelloNL.txt > HelloCRLF.txt
ほとんどコロンブスの卵みたいな方法(トリック)である。
Windows上で、Unixタイプの改行コードにする単純な方法は知らないのだが、そのような改行変換はUnix側でやったほうが楽なので、無くてもよいかもしれない。