mac(unix) と Windows で異なる「改行コード」

System.Environment.NewLine

文字列の改行コードはとりあえずこれ入れとけば機種差があっても問題ないんじゃないの? と思っていたんですが、プログラムでソースコードを自動生成するプログラム(unity だとエディタ機能など)で、ちょっとひっかかったので備忘録として。

mac(unix) は \n(LF)、Windows は \r\n(CRLF)

IEしかり、文字コードしかり、ファイルパスの区切り記号しかり、Windows デフォルト(大抵悩みの種)を数多く持つ Windows ですが、改行コードも御多分にもれず仲間外れです。

といっても、LF だけで改行と見なしてくれることも多く、Microsoft の中の人の間でも混乱があるような。

System.Environment.NewLine は OS ごとのデフォルト改行コードなので、Windows だと CRLF になっています。(なお、これを変更することはできません)

でも、同じコードを mac で並行して編集すると改行コードは LF となり、下記の問題に悩まされるようになります。

同じ文書であっても別物と扱われる(ファイル競合も起こる)
unity が警告を出す

There are inconsistent line endings in the ‘Assets/Script/xxxxx.cs’ script. Some are Mac OS X (UNIX) and some are Windows.

unity の警告

これは unity がソースコードを改行 LF で生成、その後 Windows の Visual Studio で編集した部分だけ改行が CRLF となった場合などに発生し、改行コードが混在してるとまずいunity が警告しています。

(対処法).editorconfig を用意する

こちらを用意しておくと、色々なエディタで統一コードになるようです。
改行の統一だけではなく、開発フォーマットを整える意味でも入れておいて損はなさそうですね。

root = true
[*.cs]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true

(対処法2)プログラムで自動生成するようなソースコードの改行

こちらは特に方法がなく、Stream.WriteLine や StringBuilder.AppendLine の改行も System.Environment.NewLine を参照してしまうので、テキスト構築時は諦めて、ファイル書き出し直前に問題を解決します。
書き換え部分を含めた独自の WriteText メソッドを作ってもいいですね。

string text = "   .    .    .    .   ";  // 改行入りの巨大コードテキスト

// CRLF を強制的に LF に書き換える
string lftext = text.Replace("\r\n", "\n");
File.WriteAllText("xxxxx.cs", lftext, Encoding.UTF8);

これ、結構忘れる問題…

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA