🦁

Rust の println! は Windows 環境でも CR を出力しない

に公開

Rust の println! マクロは、Windows 環境でも \n のみを出力する。これはプラットフォーム非依存の動作であり、Rust の設計思想に基づいた一貫した仕様となっている。

リファレンスを読んでいるときに気がついた。

https://doc.rust-lang.org/std/macro.println.html

背景

Windows においては、伝統的に改行コードとして \r\n(CR + LF)を使用してきた。一方で Unix 系(Linux や macOS)では \n(LF)のみが改行として使用されている。多くの言語やランタイムは、この違いを抽象化し、OS に応じた適切な改行コードを自動的に出力するように設計されていることが多い。

しかし、Rust の標準出力マクロ println! は、あくまで \n のみを出力する。そのため、コード中で改行を書いた場合、次のようになる。

fn main() {
    println!("Hello\nWorld");
}

このコードは Windows 上でも以下のように表示される。

Hello
World

Windows の標準コンソールは、近年(Windows 10 以降)では \n のみでも正しく改行を解釈できるようになっており、そのため、Rust が \r\n を明示的に出力しなくとも、大抵のケースでは問題なく動作する模様。

明示的に \r\n を出力したい場合

どうしても CRLF(\r\n)を明示的に出力したい場合は、自分で指定する必要がある。

fn main() {
    print!("Hello\r\nWorld\r\n");
}

Discussion