Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
59
Help us understand the problem. What is going on with this article?
@kaityo256

Windowsメモ帳の「右端で折り返す」で入る謎の改行コード

More than 3 years have passed since last update.

概要

Windowsの「メモ帳」で「右端で折り返す」にすると「右端」で勝手に改行される件について でも報告があるが、Windowsのメモ帳の「右端で改行」の動作がわりとファンタジック(同僚氏談)だったのでまとめてみた。

注: 本挙動はWindows 7までは再現しますが、Windows 10では修正されているそうです。Windows 8でどうなっているかは手元に無いのでわかりません。

再現手順

  • Windowsのメモ帳を起動し、「書式」の「右端で折り返す」にチェックを入れてから、長い文章を入力する。 この状態では、ウィンドウサイズを変えると、入力された内容が追従する。

ウィンドウサイズ変える前
150608_memo1.png

ウィンドウサイズ変えた後(ちゃんと追従する)
150608_memo2.png

  • 「名前をつけて保存」する(例えばtest.txt)。すると、右端に改行コードが挿入され、ウィンドウサイズを変えても入力された内容が追従しなくなる。

保存直後
150608_memo3.png

ウィンドウサイズを変えた後(表示が追従しない)150608_memo4.png

  • メモ帳の内容を別のエディタ(例えばsakuraエディタ)にコピペすると、改行が入っていること、さらに挿入されたコードが「CRCRLF」であることがわかる。ちなみにメモ帳で開いたまま、先ほど保存したファイル(test.txt)を別のエディタで開いても、改行コードは入っていない。つまり、ファイルには保存していない。

150608_memo5.png

  • ここからファンタジー度が増してくる。メモ帳で「保存」してからウィンドウサイズを変更しても内容が追従しないが、その追従していない状態でさらに「保存」してから、「全て選択(Ctrl+A)」すると、慌てて追従する。

  • サイズ変更の方法によっては、表示が正しくなくなる。「保存」してから、「全て選択(Ctrl+A)」した後に、ウィンドウサイズを大きくして、さらに「保存」すると、画面更新に失敗し、一時的に画面に本来よりも多い文字数が表示されてしまう。一度フォーカスを外してから戻すと正しく表示される。

全選択して「保存」
150608_memo6.png

ウィンドウサイズを変えてから「保存」。選択されていない文字が出現する。
150608_memo7.png

コード「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を含むテキストを読み込んで保存するときにも削除する。

59
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
kaityo256
記事中に明示されていない場合、私の記事はCC-BY 4.0で、記事に含まれるソースコードはMITライセンスで公開します。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
59
Help us understand the problem. What is going on with this article?