改行コードの変換あれこれ


2017年 08月 27日

改行は 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側でやったほうが楽なので、無くてもよいかもしれない。