無意識理解から脱する【改行コード 編】

Blog Single

Macのターミナルに出力しながら遊んでいて、改行コードをみてふと気づいたこと。
「意識しながら改行コードの使い分けをすることが最近なくなったな」
使い始めた頃はよく調べたものでした。
普段無意識で使用している方もいると思うので、この機会におさらいしてみます。

改行コードは2種類ある

改行コードは大きく分けて以下の2種類があります。

  • キャリッジリターン Carriage Return
  • ラインフィード Line Feed

キャリッジリターン Carriage Return (CR)

「復帰」の意味をもち、エスケープシーケンス\rで表します。
普段これを意図して使うことは頻繁にはないと思います。
動きとしては、現在の行の左端に位置を戻します。

ラインフィード Line Feed (LF)

「改行」の意味をもち、エスケープシーケンス\nで表します。
こちらの改行を主に使うことが多いのでわかりやすいと思いますが、
新しい行に位置を移動することができます。

そもそもなぜこの2種類の改行コードが生まれたのか。
由来はタイプライターであると言われています。
あまり馴染みがないかもしれませんので簡単に説明しますと、
タイプライターには用紙を挟む「キャリッジ」というものがあり、
改行をする際は、

  • キャリッジを右方向へ動かす(CR)
  • 新しい行部分まで用紙を送る(LF)

この2つの動作が必要になります。
私もおもちゃ程度のタイプライターなら使ったことがありますが、
改行について調べるまではこれが由来だと気づきませんでした。

OSによって使い分け

プログラムで改行する時にはOSごとに使用する改行コードが異なります。

改行コード OS
\r Mac OS(9以前)
\n UNIX系
\r\n Windows系

ん?さっきまでなかった改行コードがあるじゃないか。
この\r\nはCRとLFの2つを併せ持ったものです。
見た目の挙動的に\nと\r\nは同じですが、OSによって使っているものが異なるので注意が必要です。

ちなみにファイルで使用している改行コードを確認できるコマンドがあります。
例えばMacだとこのような感じになります。

$ od -c [ファイル名]
0000000    H   e   l   l   o   !  \n   I   '   m       M   a   o       M
0000020    i   y   a   j   i   .  \n  \n

ターミナルでCRとLFを使うとこうなる

そもそも私が改行コードをご紹介しようと思ったきっかけであるターミナルの出力。
ターミナルでコマンドを実行するとプログレスバーなどが表示されることがありますよね。
プログレスバーの出力に\r\nを使うとどう表示が変わるのか。
今回はphpでやってみます。

$allCount = 20;

for ($i = 1; $i <= $allCount; $i++) {
    echo progress($allCount, $i);
    // 次の描画まで少し時間を開ける(50ms)
    usleep(50000);
}

echo "Finish! \n";

function progress($allCount, $count)
{
    $format = sprintf(' %% 3d%%%% [%%s] %2d/%d', $count, $allCount);
    $rate = floor(100 / $allCount * $count);
    $barCount = floor($rate / 5);
    $maxBarCount = 20;
    $bar = str_repeat(' ', ($maxBarCount - $barCount));
    if ($barCount) {
        $bar = str_repeat('=', $barCount) . '>' . $bar;
    }
    // プログレスバーのあとの改行コード
    $eol = $rate == 100 ? "\n" : "\r";
    return sprintf($format, $rate, $bar) . $eol;
}

上記のコードで、$eolとしているものがプログレスバーを出力したあとの改行コードの設定です。
CRでやった場合が以下のようになります。

これをLFに書き換えて実行すると以下のようになります。

プログレスバーの進行度を一度出力した行に上書きするか、新しい行に出力するかの違いです。
たまにLFでやっているプログレスバーも見かけますが、CRの方がわかりやすいように思いますね。

おまけ

おまけとして、遊びで使用していたものはこんな感じです。
会話風に、入力後の発言を考えているかのような出力をしています。

あくまで遊びなので夢の国の住人は深く気にしないでください笑

最後に

これを覚えてしまうと、そのあとは無意識で使い分けているので時々忘れがちになります。
たまに思い出せるように備忘録として残しておけるといいですね。

ちなみにおまけ情報として、phpには改行コードをHTMLの改行<br>に置換してくれるnl2brというメソッドがあります。
これを使えばすべての改行コードに対応してくれるので便利です。
ますます無意識理解になりそうですが。。。

参考

Posted by Mao Miyaji
千葉にある夢の国を愛して止まない、元「魚のお姉さん」のエンジニア。PHP, TypeScriptメインで、暇さえあれば色々な言語を一かじり。

Other Posts: