diffコマンドで全行違うと言われたので調べたら改行コードのせいだった
自分が作ったHTMLのコードが、非エンジニア向けに配られるExcel資料に載せられることになった。そのExcelファイルを見ると、一つのセルの中にコードがそのままコピペされて入っていた。
Excelファイルを作った人が「これでいいか確認して」と言ってきたので、そのコードをエディタにコピペして元ファイルとdiff
コマンドで比べてみたら、なんと全行違うとのこと。
目で見るとどこも違っているように見えないけど...と思っていろいろ調べたら、違っているのは改行コードだとわかった。
改行コードの種類
改行コードには、CR
(carriage return)とLF
(line field)の2種類がある。タイプライター時代の名残りらしい。
それを引きずった結果、OSごとに異なる改行コードが使われるようになってしまった。
改行コードを確認する
実際に改行コードを確認してみる。
HTMLファイル
エディタを使えばなんとか確認できることが多いはず。
自分はSublime Text 3 を使っているが、改行コードを画面右下に表示するための設定方法があった。
Windows
と出たので、元のHTMLファイルはどうやらCR+LF
らしい。確かに元ファイルは前のPC(Windows)で作った覚えがある。
Excelファイル
Excelにはcode()
という関数がある。これは、使われている文字のASCIIコードを返してくれる。
これを使い、セル内改行に何が使われているのか確かめることができる。ASCIIコードと改行コードの対応は以下の通り。
- 10:
LF
- 13:
CR
さて、Excelのセル内改行は、WindowsだとLF
、MacだとCR
らしい。Excel独自の仕様はやっかいだ。
最近PCをMacBookに変えたので、受け取ったExcelファイルでcode()
関数を使うと、確かに13
と出た。Excelファイルを作った人はWindowsを使っているので、元はLF
だったのがCR
に変換されたのだろうか。
どのみち、CR+LF
ではないらしい。
地味に怖い改行コード
今回のようなケースは、エディタなどを使って改行コードを全て置換すればなんとかなる。
ただ、怖いのは複数OSのユーザを対象としたシステムやソフトウェアを作る場合。プログラムの中で思わぬ変換や誤認識が起きて、気づきにくいバグの元になりうる。
以前「WindowsとMacは全然違うよー」と冗談めかして言っていた先輩の顔が思い浮かんだ。苦労したんだろうなぁ。