TIM Labs

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

| コメント(0) | トラックバック(0)
改行は 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側では正しく改行を処理できない可能性があり、改行コードを変換しないといけない。

こういうとき様々な方法が可能なのだが、わかりやすい方法だけを紹介しよう。

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

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/670

コメントする


画像の中に見える文字を入力してください。

このブログ記事について

このページは、fujiが2017年8月27日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「Haskell の並列処理と遅延評価の罠」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。