如何在 Rust 中获取当前平台的行尾字符序列?
How to get current platform end of line character sequence in Rust?
我正在寻找一种在运行时获取平台行尾字符序列(Windows 为 CRLF,Linux/macOS 为 LF)的方法。
我认为没有任何功能可以专门执行此操作。即使是标准库的行感知功能也没有:BufRead::read_line
is documented to only recognize \n
, and BufRead::lines
(source),去除行尾字符,只对 \n
和 \r\n
这样做,不区分它是什么平台调用于。
不过,“平台行结尾”确实是一个类别错误。文件通过网络发送并从一台计算机复制到另一台计算机。如果你的程序写了需要在记事本Windows上打开的文件,生成它们的程序是Windows上的运行还是Linux上的都没有关系;它需要发出 \r\n
。同样,如果程序正在编写特定的文件格式或实现某种网络协议;格式或协议应该告诉您使用什么行分隔符。如果格式允许并且没有约定,请选择您喜欢的一种;坚持使用它。
如果您正在阅读行结尾,您可能应该容忍任何一种,就像BufRead::lines
一样。
但是,如果您真的需要,比如您的输出将被一个编写糟糕的程序读取,该程序期望在不同平台上使用不同的行结尾,您可以使用 实现这个效果的属性:
#[cfg(windows)]
const LINE_ENDING: &'static str = "\r\n";
#[cfg(not(windows))]
const LINE_ENDING: &'static str = "\n";
我正在寻找一种在运行时获取平台行尾字符序列(Windows 为 CRLF,Linux/macOS 为 LF)的方法。
我认为没有任何功能可以专门执行此操作。即使是标准库的行感知功能也没有:BufRead::read_line
is documented to only recognize \n
, and BufRead::lines
(source),去除行尾字符,只对 \n
和 \r\n
这样做,不区分它是什么平台调用于。
不过,“平台行结尾”确实是一个类别错误。文件通过网络发送并从一台计算机复制到另一台计算机。如果你的程序写了需要在记事本Windows上打开的文件,生成它们的程序是Windows上的运行还是Linux上的都没有关系;它需要发出 \r\n
。同样,如果程序正在编写特定的文件格式或实现某种网络协议;格式或协议应该告诉您使用什么行分隔符。如果格式允许并且没有约定,请选择您喜欢的一种;坚持使用它。
如果您正在阅读行结尾,您可能应该容忍任何一种,就像BufRead::lines
一样。
但是,如果您真的需要,比如您的输出将被一个编写糟糕的程序读取,该程序期望在不同平台上使用不同的行结尾,您可以使用
#[cfg(windows)]
const LINE_ENDING: &'static str = "\r\n";
#[cfg(not(windows))]
const LINE_ENDING: &'static str = "\n";