【问题标题】:Why Notepad++ shows Carriage return + Line feed for both \r and \n为什么记事本++显示回车+换行符 \r 和 \n
【发布时间】:2018-02-16 02:37:34
【问题描述】:

在 C# 中定义 4 个变量如下:

string s1 = "\r";
string s2 = "\n";
string CarriageReturn = (Convert.ToChar(13)).ToString();
string LineFeed = (Convert.ToChar(10)).ToString();

然后通过观看在 Notepad++ 中复制它们的值并单击“显示所有字符”。有趣的是,您可以看到 \r 和 \n 之间没有区别,并且对于它们两者,它都显示 CR LF。 这是一个错误还是其他什么?我们该如何解释呢?

【问题讨论】:

  • Windows 行结尾是 CRLF,所以我猜 Notepad++ 会自动对每一行执行此操作。
  • 在 Notepad++ 中输入 test<enter>again<enter>try<enter>(将 <enter> 替换为键盘上的 Enter 键)并重复您的 显示所有字符。你看到了什么?
  • 您究竟是如何将值输入 Notepad++ 的?例如,您是否将值写入控制台并从那里复制它们?或者,您是否正在查看调试器窗口中的值,然后将它们复制到 Notepad++?还是您使用其他方式?你越具体,就越有可能有人会提供正确的答案。

标签: c# .net notepad++ carriage-return linefeed


【解决方案1】:

有趣的是,您可以看到 \r 和 \n 没有区别,并且对于它们两者都显示 CR LF 是错误还是其他什么?

这不是错误。 CRLF 是 Windows 中 Environment.NewLine 的默认值:对于非 Unix 平台是一个“包含“\r\n”的字符串,对于 Unix 平台是一个包含“\n”的字符串。'

我们该如何解释?

这可能是您将字符串值输出到文件的方式造成的。如果您使用添加新行的方法,例如WriteAllLines(),那么您编写的每个值的末尾都会自动有一个CRLF。

例如,我们可以运行以下程序。

string r = "\r";
string n = "\n";
string CarriageReturn = (Convert.ToChar(13)).ToString();
string LineFeed = (Convert.ToChar(10)).ToString();

var content = new string[] {
    $"(r:{r})", 
    $"(n:{n})", 
    $"(13:{CarriageReturn})", 
    $"(10:{LineFeed})" 
};

System.IO.File.WriteAllLines("output1.txt", content);
System.IO.File.WriteAllText("output2.txt", string.Join("", content));

它产生两个输出文件。左边那个用WriteAllLines写了四行。右边那个用WriteAllText(),没有写任何新行。

在两者中,括号外的所有内容都与您的代码无关。也就是说,CRLF 符号是在对WriteAllLines 的调用中写入一行的一部分。

【讨论】:

  • 听起来他们甚至没有首先输出到文件,只是从调试器中复制值或其他什么?您的 WriteAllLines() 示例仍然按原样编写每个 CR 和 LF。
  • 嗯,不可能。复制值只是复制它们的字符串表示,而不是字符本身。
猜你喜欢
  • 2020-08-19
  • 2019-03-07
  • 2012-06-15
  • 2016-06-23
  • 2023-03-19
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多