改行コードについて調べてみた

Linux

tech-newlinecodeアイキャッチ
ブログ運営者
さいとう

閲覧いただきありがとうございます!"さいとう"と申します。わたしは異業種・未経験からIT業界に転職し、現在インフラエンジニアとしてクラウド環境の設計や構築・運用の支援を行っています。

「ファイルの互換性」と聞くと、何を思い浮かべますでしょうか。あるアプリケーションで作成したファイルを別のアプリケーションでも利用できること、ファイルの拡張子や文字コードの互換性を思い浮かべるかもしれません。そして、記事のタイトルにある「改行コード」もまた、互換性の概念に含まれる大事な要素です。


改行コードは、テキストファイルの中で改行を表す特定の文字または文字列で、システムやアプリケーションによって異なる形式が使用されています。Windowsでは「CR+LF(\r\n)」、UNIX系では「LF(\n)」、そして古いMac OSでは「CR(\r)」が使われてきました。これらの違いは、ファイルの表示や編集において思わぬ問題を引き起こすことがあります。


私自身、先日まで改行コードの存在を知りませんでした。しかし、異なるシステム間でのファイルのやり取りや、テキストエディタの設定によって生じる問題に直面したことで、その重要性を実感しました。今回の記事では、改行コードについて調べた内容をまとめています。改行コードの基本的な概念から、システム間での違いやその影響について詳しく解説します。


この記事を通じて、ファイルの互換性についての理解を深め、実務に役立てていただければ幸いです。

改行コードについて調べてみた

■はじめに

改行コードとは各行の終端にある"CRLF"・"LF"や"\r\n"、"⏎""↓"で記される特殊な文字のことです。OS別でみると、WindowsではCRLF(Carriage Return + Line Feed)、UNIX系ではLF(Line Feed)が改行コードとして採用されております。


たかが改行なのですが、CRLFとLFが違うだけでアプリケーションエラーにつながり、かつ文字コードと違ってぱっと見ではわからないため厄介な仕様です。改行コードが行の終わりを検出するため、データ処理系ツールでは致命的なエラーを引き起こします。

■改行コードの基礎

改行コードはCRLF,LF,CRの3種類があり、そのうちのCRLFとLFについて詳しく見ていきます。

CRLF (Windows)

tech-newlinecode確認1
  • CRLFは、"Carriage Return"(キャリッジリターン、\r、ASCIIコードで13)と"Line Feed"(ラインフィード、\n、ASCIIコードで10)の組み合わせです。
  • Windowsオペレーティングシステムでは、テキストファイルの各行はCRLF(\r\n)で終了します。
  • キャリッジリターン(CR)は、タイプライターのキャリッジ(紙を挟む部分)を行の始まりに戻す動作を意味し、ラインフィード(LF)は紙を一行分上に送る動作を意味します。古いタイプライターの操作に由来するこれらの用語は、テキスト表示においても行を新しい行に移動するために使われています。


LF (Unix/Linux/macOS)

tech-newlinecode確認2
  • LFは、"Line Feed"(ラインフィード、\n)のみを指します。
  • Unix系のオペレーティングシステム(LinuxやmacOSを含む)では、テキストファイルの各行は単にLF(\n)で終了します。
  • Unix系システムでは、改行と行の先頭へのキャリッジリターンは通常、一つのステップとしてLFで処理されます。これは、Unix系システムの設計哲学の一部であり、シンプルさと効率性を重視しています。


■異なる環境間での改行コードの扱い

WindowsやUNIX系、MacOSなどの異なる環境間での改行コードの違いによる問題がいくつかあります。

1. 互換性

異なるオペレーティングシステム間でテキストファイルを交換する際、改行コードの違いが互換性の問題を引き起こす可能性があります。例えば、Windowsで作成されたファイルをUnix系システムで開くと、行が正しく区切られずに表示されることがあります。これは、システムが改行を正しく認識できないためです。

2. プログラミングとデータ処理

プログラミング言語やデータ処理ツールは、ファイルを読み書きする際に改行コードを使用して行の終わりを検出します。改行コードが期待通りでない場合、プログラムやスクリプトが正しく動作しない原因となり得ます。特に、テキストファイルを解析するプログラムや、CSVファイルなどのデータファイルを扱う場合に顕著です。

3. バージョン管理

ソースコード管理ツール(Gitなど)は、改行コードの違いを変更と見なすことがあります。これにより、実際にはコードに変更がなくても、改行コードの違いだけで差分が発生し、バージョン管理の履歴が乱れる可能性があります。


ここまで改行コードの違いによる問題を3つ紹介しましたが、この中でも「3. バージョン管理」にあるGitが曲者です。なぜかというと、バージョン管理システム(特にGit)には、改行コードの自動変換機能が備わっているためです。かなりありがたい機能で、「1. 互換性」の問題を自動で解決してくれます。改行コードの自動変換機能とはどんな機能かというと、 Gitには、core.autocrlf という設定があります。


core.autocrlf がTrueの場合、Windows上でファイルをチェックアウトする際にLFをCRLFに自動変換し、コミットする際にはCRLFをLFに自動変換します。これにより、WindowsユーザーがLinuxやmacOSユーザーとコードを共有する際に改行コードの違いによる問題を防ぎます。Windowsでgitを操作している場合、おそらくデフォルトでTrueになっているかと思います。

git config --get core.autocrlf


tech-newlinecodegitcommand


この設定でpushすると、LFに自動変換されます。ためしにWindows上で作成した改行コードCRLFのファイルをGithubにpushし、Githubからテキストファイルをダウンロードしてみたところ、

tech-newlinecode確認3



tech-newlinecode確認gitリポジトリ



tech-newlinecode確認4


LFに自動変換されていますね。

■解決策

改行コードは意識しないと気付きにくいので、2つ解決策を考えてみました。

1. 改行コードの可視化

一番わかりやすい方法が改行コードの可視化です。利用しているテキストエディタにはほぼ標準で備わっているのではないでしょうか。例えば、わたしが利用しているNotepad++ではつぎのように表示させることができます。

tech-newlinecode確認4


↓[制御文字の表示]→[改行コードを表示]

tech-newlinecode確認7



tech-newlinecode確認7


[CRLF]と表示されました。しかし、慣れないとめちゃくちゃ文字が邪魔です。


↓サクラエディタだと、矢印で教えてくれます。


[CRLF]

tech-newlinecodeテスト3

 
[LF]

tech-newlinecodeテスト2


VScodeだと拡張機能の[ line-endings ]をインストールすることで表示させることが可能です。

tech-newlinecodeテスト1


2. .gitattributes ファイルを使った改行コードの管理。

改行コードを可視化していてもミスすることがありますので、gitの設定で自動変換を無効化する方法もあります。改行コードの管理をするファイル[.gitattributes ]をリポジトリのルートディレクトリやサブディレクトリに配置することで、特定のファイルやファイルパターンに対する設定が可能です。例えばテキストファイルの自動変換を無効化したい場合、次のような記述が書かれた".gitattributes “ファイルを用意しましょう。

tech-newlinecodegitリポジトリ


↓このファイルを設定したあと、ためしに改行コードCRLFのテキストファイルをpushしてみて、ファイルを確認してみると、LFに変換されずCRLFのままでした。

tech-newlinecodeテスト4


しかし、当然ながら自動変換は有用であるがために最初から設定されています。自動変換を無効にすると、異なるオペレーティングシステム間で*.txtファイルを共有する際に改行コードに関する問題が発生する可能性があります。


もし無効化する必要がある場合は、特定のファイルのみに絞って運用しましょう。

test-crlf.txt -text


まとめ

改行コードは、表面的には小さな違いのように見えますが、実際にはファイルの互換性、プログラミング、データ処理、バージョン管理において非常に重要な役割を果たします。改行コードの違いを無視すると、ファイルが正しく表示されなかったり、プログラムが予期せぬ動作をしたりすることがあります。


異なる環境間でのスムーズなファイルのやり取りを実現するためには、改行コードの違いを理解し、適切に扱うことが必要です。例えば、Windowsで作成されたテキストファイルがUNIXシステムで正しく表示されない場合や、その逆のケースも考えられます。また、プログラムの正確な実行を確保するためには、開発環境やデプロイ環境で一貫した改行コードを使用することが重要です。


さらに、効率的なバージョン管理を行うためにも改行コードの理解は不可欠です。異なる改行コードが混在すると、バージョン管理システムが変更点を正しく認識できず、無駄な差分が発生することがあります。これにより、コードレビューが難しくなったり、マージ作業が煩雑になることもあります。

不要なトラブルを避け、作業の効率化を図るためには、改行コードについての理解を深めることが大切です。適切なツールやエディタの設定を活用し、統一された改行コードを使用することで、日常の作業がスムーズに進むようになります。


改行コードは一見すると単純な概念ですが、その影響は広範囲にわたります。この記事を通じて改行コードの重要性を理解し、実務でのトラブルを防ぐ一助になれば幸いです。これからも改行コードについての知識を深め、より効率的で信頼性の高い作業環境を構築していきましょう。

参考サイトリンク:ASCII:Windowsにおける改行文字の扱い