概要
Windowsの「メモ帳」で「右端で折り返す」にすると「右端」で勝手に改行される件について でも報告があるが、Windowsのメモ帳の「右端で改行」の動作がわりとファンタジック(同僚氏談)だったのでまとめてみた。
注: 本挙動はWindows 7までは再現しますが、Windows 10では修正されているそうです。Windows 8でどうなっているかは手元に無いのでわかりません。
再現手順
- Windowsのメモ帳を起動し、「書式」の「右端で折り返す」にチェックを入れてから、長い文章を入力する。 この状態では、ウィンドウサイズを変えると、入力された内容が追従する。
- 「名前をつけて保存」する(例えばtest.txt)。すると、右端に改行コードが挿入され、ウィンドウサイズを変えても入力された内容が追従しなくなる。
- メモ帳の内容を別のエディタ(例えばsakuraエディタ)にコピペすると、改行が入っていること、さらに挿入されたコードが「CRCRLF」であることがわかる。ちなみにメモ帳で開いたまま、先ほど保存したファイル(test.txt)を別のエディタで開いても、改行コードは入っていない。つまり、ファイルには保存していない。
ここからファンタジー度が増してくる。メモ帳で「保存」してからウィンドウサイズを変更しても内容が追従しないが、その追従していない状態でさらに「保存」してから、「全て選択(Ctrl+A)」すると、慌てて追従する。
サイズ変更の方法によっては、表示が正しくなくなる。「保存」してから、「全て選択(Ctrl+A)」した後に、ウィンドウサイズを大きくして、さらに「保存」すると、画面更新に失敗し、一時的に画面に本来よりも多い文字数が表示されてしまう。一度フォーカスを外してから戻すと正しく表示される。
ウィンドウサイズを変えてから「保存」。選択されていない文字が出現する。
コード「CRCRLF」
「表示では改行されているが、保存されない」という改行コードは「CRCRLF」で表現されている。そこで、CRCRLFを吐くコードを書いてみる。
test.cc
#include<stdio.h>
int
main(void){
const char cr = 0x0d;
const char lf = 0x0a;
for(int i=0;i<10;i++){
printf("%c%c%c%c",'a',cr,cr,lf);
}
}
上記を実行して、test.txtに吐く。
$ g++ test.cc
$ ./a.out > test.txt
$ cat test.txt
a
a
a
a
a
a
a
a
a
a
メモ帳で読み込んで「右端で改行」にチェックは入った状態で「保存」すると、改行が消える。
$ cat test.txt
aaaaaaaaaa
まとめ
Windowsのメモ帳は、「右端で改行」をするときには内部的に「CRCRLF」を挿入するが、これは「ファイルに保存されない」のではなく、「保存」するときに自動で削除されている。別のプログラムで作成された、CRCRLFを含むテキストを読み込んで保存するときにも削除する。