
改行(行末、行末(EOL)、次の行(NEL)、または改行とも呼ばれる)は、ASCII、EBCDIC 、 Unicodeなどの文字エンコーディング仕様における制御文字または制御文字のシーケンスです。改行は、テキスト行の終わりと新しい行の始まりを示すために使用されます。[ 1 ]
1800年代半ば、テレプリンターやテレタイプが登場するずっと以前に、モールス符号のオペレーターや電信技師は、正式な文書メッセージにおける空白文字の書式を符号化するために、モールス符号の略記号を考案し、使用していました。特に、モールス符号の略記号BT(ニーモニック・ブレーク・テキスト)は、通常の文字間隔を空けずに、文字「B」と「T」を連結して表され、正式な文書メッセージにおける改行や新しいセクションを符号化して示すためにモールス符号で使用されます。
その後、現代のテレプリンターの時代には、空白文字の書式設定を支援するために、標準化された文字セット制御コードが開発されました。ASCIIは、国際標準化機構(ISO)と米国規格協会(ASA)によって同時に開発されました。ASAは、米国規格協会(ANSI)の前身組織です。1963年から1968年の期間、ISOの草案規格は、改行としてキャリッジリターンとラインフィード(CR + LF)またはLFのみの使用をサポートしていましたが、ASAの草案はCR + LFのみをサポートしていました。
CR + LF のシーケンスは、コンソール デバイスとしてTeletypeマシン (通常はTeletype Model 33 ASR)を採用した初期のコンピュータ システムでよく使用されていました。これは、これらのプリンタを新しい行の先頭に配置するためにこのシーケンスが必要だったためです。改行を 2 つの機能に分離すると、プリント ヘッドが右端から次の行の先頭に間に合わずに次の文字を印刷できないという事実が隠蔽されます。CR の後に印刷された文字は、プリントヘッドがまだキャリッジを最初の位置に戻している間に、ページの中央ににじみとして印刷されることがよくありました。「解決策は、改行を 2 つの文字にすることでした。CRでキャリッジを 1 列目に移動し、LFで用紙を上に移動します。」[ 2 ]実際には、余分なパディング文字(余分なCRまたはNUL )を送信する必要がよくありました。これらは無視されますが、プリント ヘッドが左余白に移動する時間を与えます。初期のビデオ ディスプレイの多くも、ディスプレイをスクロールするために複数の文字時間が必要でした。
こうしたシステムでは、デバイスドライバがハードウェアの詳細をアプリケーションから隠蔽するという概念がまだ十分に開発されていなかったため、アプリケーションはテレタイプ端末と直接通信し、その慣例に従う必要がありました。そのため、テキストはテレタイプ端末の要求を満たすように作成するのが一般的でした。DECのミニコンピュータシステムのほとんどがこの慣例を採用していました。CP /Mも、ミニコンピュータと同じ端末で印刷するためにこの慣例を使用していました。そこから、MS-DOS(1981年)は互換性を保つためにCP/MのCR + LFを採用し、この慣例は後にMicrosoftのWindowsオペレーティングシステムにも引き継がれました。
Multicsオペレーティングシステムは 1964 年に開発が開始され、改行文字としてLFのみを使用していました。Multics はデバイスドライバを使用してこの文字をプリンタが必要とする任意のシーケンス (追加のパディング文字を含む) に変換し、1 バイトの方がプログラミングに便利でした。より明白な選択肢と思われるCRは使用されませんでした。CRは、1 行を別の行で上書きして太字、アンダースコア、取り消し線効果を作成する便利な機能を提供していたためです。おそらくさらに重要なのは、行末文字としてLFのみを使用することが、最終的にISO/IEC 646規格の草案にすでに組み込まれていたことです。UnixはMultics の慣習に従い、後のUnix ライクなシステムは Unix に従いました。これにより、Windows と Unix ライクなオペレーティングシステムの間で競合が発生し、あるオペレーティングシステムで作成されたファイルは、別のオペレーティングシステムで正しくフォーマットまたは解釈できないことになりました (たとえば、Windows のテキストエディタであるNotepad [ 3 ] [ 4 ]で書かれたUNIX シェルスクリプト)。
キャリッジリターン(CR) とラインフィード (LF)の概念は密接に関連しており、別々に考えることも、まとめて考えることもできます。タイプライターやプリンターの物理的な媒体では、ページに新しい行を作成するために、「下」と「横」の 2 つの動作軸が必要です。機械 (タイプライターまたはプリンター) の設計ではこれらを別々に考慮する必要がありますが、ソフトウェアの抽象ロジックでは、これらを 1 つのイベントとして組み合わせることができます。これが、文字エンコーディングにおける改行がとして定義され、 と1 つ (一般にまたは と呼ばれる) にまとめられる理由です。CRLFCR+LFCRLF
文字セットによっては、改行文字コードが別途用意されているものもあります。例えば、EBCDIC では、 CRおよびLFコードに加えてNL文字コードが用意されています。Unicodeでは、 ASCII のCRおよびLF制御コードに加えて、「次の行」(NEL )制御コード、さらに「行区切り記号」および「段落区切り記号」の制御コードも用意されています。Unicode には、制御ピクチャブロックで、改行 ␊、キャリッジリターン ␍、その他の C0 制御コード(および汎用改行 )を視覚的に表現するための印刷可能な文字も含まれています。
0x85#多くの通信プロトコルには、何らかの改行規則が定められています。特に、インターネット技術タスクフォース(IETF)が発行するプロトコルでは、一般的にASCIIのCRLFシーケンスが使用されます。
古いプロトコルの中には、改行の後にチェックサムまたはパリティ文字が続くものがある。
Unicode標準では、準拠するアプリケーションが行末文字として認識すべき文字がいくつか定義されています。[ 9 ]
すべての行末文字を単一の文字( LFなど)に変換するなどの方法に比べると複雑すぎるように思えるかもしれませんが、Unicodeはテキストファイルを既存のエンコーディングからUnicodeに変換し、また元に戻す際にすべての情報を保持するように設計されているため(往復整合性)、Unicodeは他のエンコーディングによって行われる改行についても同様の区別をする必要があります。たとえば、EBCDICにはNL、CR、LFの文字があるため、これら3つすべてがUnicodeにも存在する必要があります。
ほとんどの改行文字と改行シーケンスはASCIIのC0制御範囲(つまり、Unicodeコードポイントが0x1Fまで)にあります。この範囲外の3つの改行文字(NEL、LS、PS)は、ソフトウェアによって改行として認識されないことがよくあります。例:
Unicodeには、文書の読者に対してユーザーに見える文字を表示することを目的としたグリフがいくつか含まれており、そのため、それ自体は改行として認識されません。
HTMLでは、改行は空白であり、一般的にはスペースと区別なく扱われます。[ 16 ]段落はHTML要素の別々のインスタンスを使用して作成され、段落の物理的な分離はレンダリング エンジンによって制御されます。[ 17 ]<p>
改行は、HTML 要素を使用して明示的に作成できます。スクリーン リーダーがページを解釈できるようにするために、HTML ドキュメントでは、段落にこの要素を使用しないことを推奨しています。代わりに、MDN Web Docsなどの情報源では、詩にこの要素を使用することを推奨しています。[ 18 ]<br>
移植性の高いプログラムを作成しやすくするために、プログラミング言語は、さまざまな環境で使用されるさまざまな種類の改行シーケンスを扱うための抽象化機能を提供している。
C言語はエスケープシーケンス\n(改行)と(キャリッジリターン)を提供します。ただし、これらはASCIIのLFおよびCR\r制御文字と同等である必要はありません。C規格は、次の2つの特性のみを保証します。
\nシステムで使用されるネイティブの改行シーケンスに透過的に変換されます。このシーケンスは1文字より長くなる場合があります。テキストモードで読み込む場合、ネイティブの改行シーケンスはに変換されます\n。バイナリモードでは、変換は行われず、によって生成された内部表現が\n直接出力されます。C言語の発祥地であるUnixオペレーティングシステムプラットフォームでは、ネイティブの改行シーケンスはASCII LF(0x0A)であるため、単純にその値として定義されていました。内部表現と外部表現が同じであるため、テキストモードで実行される変換は何もせず、Unixにはテキストモードとバイナリモードの概念がありません。このため、Unixシステム上でソフトウェアを開発した多くのプログラマーは、この区別を完全に無視してしまい、結果として異なるプラットフォーム間で移植できないコードが生まれてしまいました。\n
C言語の標準ライブラリ関数fgets ()は、バイナリモードでは使用を避けるのが最善です。Unixの改行規則に従って書き込まれていないファイルは、正しく読み込まれないからです。また、テキストモードでも、システムのネイティブな改行シーケンスに従って書き込まれていないファイル(例えば、Unixシステムで作成され、Windowsシステムにコピーされたファイルなど)は、同様に正しく読み込まれません。
もう一つのよくある問題は、\nインターネットプロトコルを使用して通信する際に、行末にASCII CR + LFを使用することが義務付けられている場合です。テキストモードのストリームに書き込むと、Windowsシステムでは正しく動作しますが、 UnixではLFしか生成されず、より特殊なシステムでは全く異なる結果になります。バイナリモードでの使用は、若干改善されます。\n\r\n
C++、Perl、[ 19 ]、Haskellなどの多くの言語は、\nCと同じ解釈を提供します。C++には、マニピュレータstd::endlを使用して改行を出力(およびストリームバッファをフラッシュ)できる代替の入出力(I/O)モデルがあります。
Java、PHP、[ 20 ]、Python [ 21 ]\r\nは、(ASCII CR + LFの場合) シーケンスを提供します。C とは対照的に、これらはそれぞれU+000DとU+000Aの値を表すことが保証されています。
Javaクラス ライブラリの入出力(I/O) メソッドは、入力または出力時にこれらの改行シーケンスをプラットフォーム依存の改行シーケンスに透過的に変換しません。代わりに、ネイティブの改行シーケンスを自動的に追加する完全な行を書き込む関数と、行末文字としてCR、LF、またはCR + LFを受け入れる行を読み取る関数 ( BufferedReader.readLine()を参照) を提供します。System.lineSeparator ()メソッドを使用して、基となる行区切り文字を取得できます。これは、書式指定子を使用する場合にも自動的に挿入されます。%nSystem.out::printf
例:
String eol = System.lineSeparator ( ); String lineColor = "Color: Red " + eol ;Pythonにはデフォルトで有効になっている「ユニバーサル改行サポート」機能があり、ファイルの読み取り、モジュールのインポート、ファイルの実行時に、よく使われる3つの改行規則( \n、、)をPythonの標準規則に変換します。この機能は\r、ファイルを開くときに関数の引数を使用して制御できます。 [ 22 ] [ 23 ]\r\n\nnewlineopen()
一部の言語では、プログラム実行中に改行を容易にするために、特別な変数、定数、およびサブルーチンが作成されています。PHPやPerlなどの一部の言語では、およびを含むすべてのエスケープシーケンスのエスケープ置換を実行するために二重引用符が必要です。PHPでは、移植性の問題を回避するために、PHP_EOL定数を使用して改行シーケンスを発行する必要があります。[ 24 ]\n\r
C#の例:
string eol = Environment.NewLine ; string lineColor = "Color: Red" + eol ; string eol2 = "\n" ; string lineColor2 = " Color : Blue" + eol2 ;
改行規則の違いにより、異なる種類のシステム間で転送されたテキストファイルが正しく表示されない場合があります。
Unix系OSや従来のMac OSでよく使われるプログラムで作成されたファイル内のテキストは、 MS-DOSやMicrosoft Windowsでよく使われるほとんどのプログラムでは、1行の長いテキストとして表示されます。これは、これらのプログラムが1行line feedまたは1行のcarriage returnテキストを改行として表示しないためです。
逆に、Windows コンピュータから作成されたファイルを Unix 系システムで表示する場合、余分なCR は、2 回目の改行、^M、または各行の末尾に<cr>として表示されることがあります。
さらに、テキストエディタ以外のプログラムでは、例えば設定ファイルなど、外国語の改行規則を使用してエンコードされたファイルを有効なファイルとして認識しない場合があります。
問題は、一部のプログラムが外国語の改行を正しく処理する一方で、そうでないプログラムもあるため、見つけにくい場合があります。たとえば、ソースファイルがコンソールやエディタで正しく表示されていても、コンパイラが分かりにくい構文エラーで失敗することがあります。最新のテキストエディタは一般的に、あらゆる種類のCR + LF改行を認識し、ユーザーが異なる規格間で変換できるようにしています。Webブラウザも通常、異なる種類の改行を使用するテキストファイルやWebサイトを表示できます。
プログラムがさまざまな改行規則をサポートしている場合でも、これらの機能は十分にラベル付け、説明、または文書化されていないことがよくあります。通常、さまざまな改行規則を列挙したメニューまたはコンボボックスがユーザーに表示されますが、選択によって改行が再解釈されるのか、一時的に変換されるのか、永続的に変換されるのかは示されません。一部のプログラムは、開く、コピーする、貼り付ける、または保存する際に暗黙的に変換しますが、その動作は一貫性に欠けることがよくあります。
ほとんどのテキストベースのインターネットプロトコル(HTTP、SMTP、FTP、IRCなど多数)は、プロトコルレベルでASCII CR + LF(、0x0D 0x0A )の使用を義務付けていますが、寛容なアプリケーションは単独のLF(、0x0A)も認識することを推奨しています。規定された標準にもかかわらず、多くのアプリケーションは、キャリッジリターンエスケープと改行エスケープシーケンスの正しい組み合わせ(CR + LF)の代わりに、誤ってC言語の改行エスケープシーケンス(LF)を使用しています(上記の「プログラミング言語の改行」のセクションを参照)。このような誤ったエスケープシーケンスの偶発的な使用は、推奨されている寛容な解釈ではなく、標準のより厳格な解釈に従うシステムと通信しようとしたときに問題を引き起こします。そのような寛容でないシステムの1つがqmailメール転送エージェントで、必要なCR + LFの代わりにLFのみを送信するシステムからのメッセージの受け入れを積極的に拒否します。[ 25 ]\r\n\n\n\r\n
電子メールの標準インターネットメッセージフォーマット[ 26 ]では、「CRとLFはCRLFとしてのみ一緒に出現しなければならず、本文中に単独で出現してはならない」と規定されています。SMTP実装間で、裸のLFおよび/または裸のCR文字の扱い方が異なるため、「SMTPスマグリング」と呼ばれるSMTPスプーフィング攻撃が発生しています。[ 27 ]
ファイル転送プロトコルは、 「ASCII モード」で転送する場合、異なる改行表現を持つシステム間で転送されるファイルの改行を自動的に変換できます。しかし、バイナリ ファイルをこのモードで転送すると、通常は深刻な問題が発生します。このコンテキストでは行末の意味を持たない、通常のバイト シーケンスの一部である改行バイト シーケンスが出現すると、相手側のシステムが使用する改行表現に変換され、事実上ファイルが破損します。FTP クライアントは、バイナリ モードまたは ASCII モードを自動的に選択するために、多くの場合、何らかのヒューリスティック(たとえば、ファイル名拡張子の検査) を使用しますが、最終的には、ファイルが正しいモードで転送されていることを確認するのはユーザーの責任です。正しいモードについて疑問がある場合は、バイナリ モードを使用する必要があります。そうすれば、FTP によってファイルが変更されることはありませんが、正しく表示されない可能性があります。[ 28 ]
テキストエディタは、異なる改行形式間でテキストファイルを変換するためによく使用されます。最新のエディタのほとんどは、少なくとも異なるASCII CR / LF規則を使用してファイルを読み書きできます。
例えば、エディタのVimは、Windowsのメモ帳テキストエディタと互換性のあるファイルを作成できます。Vim内では
ファイル形式をdosに設定し ます : wqエディタは、大きなファイルの変換や多数のファイルの一括変換には適さない場合があります。大きなファイル(Windows NTの場合)の変換には、以下のコマンドがよく使用されます。
D:\> TYPE unix_file | FIND /V "" > dos_file 異なる改行規則間でファイルを変換するための専用プログラムには、unix2dosとdos2unix、mac2unixとunix2mac、mac2dosとdos2mac、およびflip があります。[ 29 ] trコマンドは、ほぼすべてのUnix ライクなシステムで使用でき、単一文字に対して任意の置換操作を実行できます。DOS/Windows テキストファイルは、すべての ASCII CR文字を削除するだけで Unix 形式に変換できます。
$ tr -d '\r' <入力ファイル>出力ファイル
または、テキストにCR改行しかない場合は、すべてのCR改行をLFに変換して
$ tr '\r' '\n' <入力ファイル>出力ファイル
同様のタスクは、awk、sed、またはプラットフォームにPerlインタープリタがある場合はPerlを使用して実行されることもあります。
$ awk '{sub("$","\r\n"); printf("%s",$0);}' inputfile > outputfile # UNIX から DOS へ (GNU 拡張機能のない Linux および BSD ベースの OS に CR を追加) $ awk '{gsub("\r",""); print;}' inputfile > outputfile # DOS から UNIX へ (GNU 拡張機能を持たない Linux および BSD ベースの OS では CR を削除) $ sed -e 's/$/\r/' inputfile > outputfile # UNIX から DOS へ (GNU 拡張機能を使用する Linux ベースの OS では CR を追加) $ sed -e 's/\r$//' inputfile > outputfile # DOS から UNIX へ (GNU 拡張機能を使用する Linux ベースの OS では CR を削除) $ perl -pe 's/\r?\n|\r/\r\n/g' inputfile > outputfile # DOS に変換$ perl -pe 's/\r?\n|\r/\n/g' inputfile > outputfile # UNIX に変換$ perl -pe 's/\r?\n|\r/\r/g' inputfile > outputfile # 古い Mac に変換fileコマンドは、行末の種類を識別できます。
$ file myfile.txt myfile.txt: CRLF 行末文字を含む ASCII 英語テキストUnixのegrep(拡張grep)コマンドは、UnixまたはDOSファイルのファイル名を表示するために使用できます(UnixおよびDOS形式のファイルのみを対象とし、従来のMac OS形式のファイルは対象外です)。
$ egrep -L '\r\n' myfile.txt # UNIX スタイルのファイル (LF で終了) を表示$ egrep -l '\r\n' myfile.txt # DOS スタイルのファイル (CRLF で終了) を表示その他のツールを使用すると、ユーザーは改行文字を視覚化できます。
$ od -a myfile.txt $ cat -e myfile.txt $ cat -v myfile.txt $ hexdump -c myfile.txt 改行の見方には、どちらも矛盾しない2つの方法があります。それは、改行が行を区切る、または行を終了させるというものです。改行が区切り文字とみなされる場合、ファイルの最後の行の後には改行はありません。一部のプログラムは、ファイルの最後の行が改行で終了していない場合、処理に問題が生じます。一方、改行が区切り文字として使用されることを想定しているプログラムは、最後の改行を新しい(空の)行の開始として解釈します。逆に、改行が終了文字とみなされる場合、最後の行を含むすべてのテキスト行は改行で終了することが想定されます。テキストファイルの最後の文字シーケンスが改行でない場合、ファイルの最後の行は不適切または不完全なテキスト行とみなされるか、ファイルが不適切に切り詰められたとみなされる可能性があります。POSIX標準は後者の立場を取り、改行を行の終了文字とみなしています。[ 30 ]
ワードラップ機能を実装したソフトウェアを使用して人間が主に読むことを想定したテキストでは、通常、次の単語が同じ行に収まるかどうかに関係なく、段落間や縦方向のリストなど、改行が必要な場合にのみ改行文字を保存する必要があります。したがって、ワープロソフトやほとんどのテキストエディタのロジックでは、改行は段落区切りとして使用され、「ハードリターン」と呼ばれます。これに対し、ワードラップを実装するために動的に作成され、表示インスタンスごとに変更可能な「ソフトリターン」があります。多くのアプリケーションでは、単一の段落内で強制的に改行するための「手動改行」と呼ばれる別の制御文字が存在します。ハードリターンの制御文字のグリフは通常段落記号(¶)であり、手動改行の制御文字のグリフは通常キャリッジリターン矢印(↵)です。
RI ( U +008D 逆行送り、[ 31 ] ISO/IEC 6429 8D、10 進数 141) は、印刷位置を 1 行後ろに移動 (用紙を逆送りするか、表示カーソルを 1 行上に移動することによって) して、既存のテキストの上に他の文字を印刷できるようにするために使用されます。これは、文字を太字にしたり、下線、取り消し線、または発音記号などの他の文字を追加したりするために行われます。逆行送りは、ハッカーズ ディクショナリーでは、 line feed をもじったline starveと呼ばれていました。[ 32 ]
同様に、PLD(U +008B 部分行前進、10進数139)とPLU(U +008C 部分行後退、10進数140)を使用すると、テキストの印刷位置を垂直行間隔の一定割合(通常は半分)だけ進めたり戻したりできます。これらは、下付き文字(進めてから戻)と上付き文字(戻してから進める)に組み合わせて使用でき、発音記号の印刷にも役立ちます。
<PRE>...</PRE>[A]何十年にもわたる不満と、Linux マシンから構成ファイルの 1 行を変更するために実際のテキスト エディタをダウンロードしなければならなかった後、Microsoft はメモ帳を更新し、Unix、Linux、macOS 環境で使用される改行文字を処理できるようにしました。
長年使用されてきたツールへの変更と同様に、この新しい動作がシナリオに合わない場合や、この新しい動作を無効にしてメモ帳の元の動作に戻したい場合もあるでしょう。これを行うには、[...レジストリキー...]を変更して、メモ帳がテキストの貼り付けをどのように処理するか、またEnter/Returnキーが押されたときにどのEOL文字を使用するかを調整できます。
ユニバーサル改行 - 特殊モード「U」(「r」の代わりに)で読み取り用に開かれたファイルは、よく使われる 3 つの改行規則 (n、r、rn) をすべて Python の標準 n 規則に変換します。Jack Jansen 氏による貢献。(PEP 278)
。迷ったときはバイナリモードで転送してください。
行: 0 個以上の <改行> 以外の文字のシーケンスと、終端の <改行> 文字。この線の定義が意味するところについてのより詳しい説明は、https://stackoverflow.com/a/729795でご覧いただけます。
いくつかの項目は典型的なコンピュータ用語です。 ....
line feed は、ダジャレの項目
line starve
を説明するためにリストされています
。