diffコマンドで全行違うと言われたので調べたら改行コードのせいだった

自分が作ったHTMLのコードが、非エンジニア向けに配られるExcel資料に載せられることになった。そのExcelファイルを見ると、一つのセルの中にコードがそのままコピペされて入っていた。
Excelファイルを作った人が「これでいいか確認して」と言ってきたので、そのコードをエディタにコピペして元ファイルとdiffコマンドで比べてみたら、なんと全行違うとのこと。
目で見るとどこも違っているように見えないけど...と思っていろいろ調べたら、違っているのは改行コードだとわかった。

改行コードの種類

改行コードには、CR (carriage return)とLF(line field)の2種類がある。タイプライター時代の名残りらしい。
それを引きずった結果、OSごとに異なる改行コードが使われるようになってしまった。

  • LF: Unix系、macOSなど -> \n
  • CR+LF: Windowsなど -> \r\n
  • CR: Classic Mac OS (バージョン9までのもの) -> \r

改行コードを確認する

実際に改行コードを確認してみる。

HTMLファイル

エディタを使えばなんとか確認できることが多いはず。
自分はSublime Text 3 を使っているが、改行コードを画面右下に表示するための設定方法があった。

beadored.com

Windowsと出たので、元のHTMLファイルはどうやらCR+LFらしい。確かに元ファイルは前のPC(Windows)で作った覚えがある。

Excelファイル

Excelにはcode()という関数がある。これは、使われている文字のASCIIコードを返してくれる。
これを使い、セル内改行に何が使われているのか確かめることができる。ASCIIコードと改行コードの対応は以下の通り。

  • 10: LF
  • 13: CR

さて、Excelのセル内改行は、WindowsだとLFMacだとCRらしい。Excel独自の仕様はやっかいだ。

www.dtp-transit.jp

最近PCをMacBookに変えたので、受け取ったExcelファイルでcode()関数を使うと、確かに13と出た。Excelファイルを作った人はWindowsを使っているので、元はLFだったのがCRに変換されたのだろうか。
どのみち、CR+LFではないらしい。

地味に怖い改行コード

今回のようなケースは、エディタなどを使って改行コードを全て置換すればなんとかなる。
ただ、怖いのは複数OSのユーザを対象としたシステムやソフトウェアを作る場合。プログラムの中で思わぬ変換や誤認識が起きて、気づきにくいバグの元になりうる。
以前「WindowsMacは全然違うよー」と冗談めかして言っていた先輩の顔が思い浮かんだ。苦労したんだろうなぁ。