PHPでデータベースからデータを取得させて、csv出力をしようとしているんですけど、echoで¥rや¥nを出力してもcsvファイルをダウンロードしてみると、つながっちゃってるんですよね。。いつも悩んでおりました。

で、昔の経験をひもといてみると、0x0aと0x0dを出力すればいいのではないかと思い当たりました。0x0aはchr(10)で0x0dはchr(13)です。

  • chr(13): carriage return
    • 昔のタイプライターの概念がキャラクターコードの原点です。CR(carriage return)はタイプライターの文字うちドラムを元に戻す動作になります。昔の映画などでタイプライターを打つシーンがありますよね。あれを思い出してみてください。文字を打つごとにドラムがどんどん右に行きますよね。で、行を変更する前(後)に、ドラムを手で左に戻しますよね。あれがCR(carriage return)です。
  • chr(10) :  line feed
    • こちらがタイプライターでいうところの改行です。なので、文字を打つたびに右に行ってしまうドラムを一番左に戻す(return)するのが、carriage returnで、その後に改行をしないと文字を上書きされちゃいますので、行を次ぎに送る動作、つまり改行をするのがLine feedになります。
medium_5554550186photo credit: Tony Frates via photopin cc
 
この概念について、最近のプログラマの方はあまりなじみがないかもしれませんが、8bit,16bitコンピュータを扱っていた人たちにとっては、常識中の常識です。FM-7やらPC-9801あたりですね。表示する際にはこの2つのコードを出力しないと、ちゃんと画面送りが出来ませんでした。
 
たまには昔の知識が役に立つもんですね。。。あとは、CTRL+Sで画面スクロールを止めたり、CTRL+Qでまたスクロールしはじめるんですよね。。これは皆さすがに知らないかな。。30年ぐらいプログラマやってると、新しい技術に頭がついていかないような気もするけど、応用する事で習得時間はかかるけど若い人と同じようにまだまだ現役で戦えるのではないか?そんな妄想を最近しております。