如何在Rust中获取当前平台的行尾字符序列?

Geo*_*tic 3 rust

我正在寻找一种方法来在运行时获得平台行结束字符序列(Windows的CRLF,Linux/macOS的LF).

tre*_*tcl 6

我不相信有任何特殊功能.即使标准库的行知识功能也没有:BufRead::read_line记录为仅识别\nBufRead::lines(源),它们剥离行尾字符,只是为了\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";
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,除了一个尼特:有*这样的东西作为平台的本地行结束,并且创建需要查看和编辑的本地文本文件的程序应该尊重它.至少我知道我讨厌在Unix上用CRLF结尾创建文件的程序. (4认同)
  • @user4815162342 你说得很好,虽然我认为创建本地文本文件供人类查看的程序应该无条件地使用`\n`,而用户应该使用,哦,*除记事本以外的任何程序*在 Windows 上查看它们. (3认同)
  • 注意:甚至 MS 记事本现在也支持 \n:https://devblogs.microsoft.com/commandline/extended-eol-in-notepad/ (2认同)
  • 这应该像路径分隔符一样在 std 中定义。如果在需要的地方没有可用的本机行结尾,这是不一致且令人烦恼的。例如 https://doc.rust-lang.org/std/path/constant.MAIN_SEPARATOR.html (2认同)