【问题标题】:How to replace NewLine in .NET for Linux NewLine如何在 .NET for Linux NewLine 中替换 NewLine
【发布时间】:2014-02-04 19:30:34
【问题描述】:

我在 .NET 中有一个这样定义的字符串:

var str = @"line 1
line 2
line 3";

我想替换 Linux 等效项的 Windows 换行符。 (将 \r\n 替换为 \n)。

我试过var str2 = str.replace(Environment.NewLine, "\n");,但结果是完全相同的字符串(str == str2 为真)。

我猜 Windows 将字符串中的 \n 替换为 \r\n,实际上什么也没改变。

我尝试了var str2 = str.replace(Environment.NewLine, '\n');,但出现编译错误,因为一个参数是字符串,另一个是字符。

我什至尝试过var str2 = str.replace(Environment.NewLine, '\n'.ToString());,但也没有用。

想法?

【问题讨论】:

  • 你试过str.Replace("\r", "");吗?
  • A) 你确定它一开始就坏了,B) 你把它写到文件里了吗? "\n" 绝对不会自动转换为 "\r\n"
  • 我从 DotNetFiddle 中的 @Vache 那里得到了要点,但是当我自己在笔记本电脑上尝试时,我确实有 \r\n。
  • IdeOne 还有一个结果:ideone.com/uWKkTl
  • IdeOne 和 .NETFiddle 的区别可能是因为前者是 Unix 2.6.32.46 而后者是 Microsoft Windows NT 6.2.9200.0

标签: c# .net newline line-breaks


【解决方案1】:

str 替换后等于str2,因为您的原始字符串首先不包含\r\n

看到这个fiddle

多行字符串使用\n

【讨论】:

    【解决方案2】:

    看起来这在很大程度上取决于您正在使用的工具。 并且,关于您如何键入或粘贴文字。

    带有换行符的文字字符串似乎因工具而异。 人们可能会担心 Environment.NewLine 也可能因工具而异(除了机器),但我还没有展示出来。

    您还可以复制和粘贴带有换行符的文字,该换行符与您在工具中点击“enter”/“return”时不同。
    好玩的东西! :)

    当它像这样计算时,跨平台的安全赌注是在单行字符串中使用这些文字 - 例如 C# 中的“\r\n” - 并且不要在编辑器中使用换行符。 或者,如果这样更方便获取更多数据,则可以从文件中加载。


    把这个放到VS里,然后DotNetFiddle看看不同的结果:

            var strMyString = @"start
            asdf
            end";
            byte[] ASCIIValues = System.Text.Encoding.ASCII.GetBytes(strMyString);
            string strENL = "";
            foreach (byte b in ASCIIValues)
            {
                strENL += b + " ";
            }
            Console.WriteLine("strMyString is as ascii: " + strENL);
    
            /////////
            Console.WriteLine("\n\n");
            var str2 = strMyString.Replace("\r","");
            Console.WriteLine("string 2 matches == " + (strMyString == str2).ToString());
    
            var str3 = strMyString.Replace("\n", "");
            Console.WriteLine("string 3 matches == " + (strMyString == str3).ToString());
    
            var str4 = strMyString.Replace(Environment.NewLine,"\n");
            Console.WriteLine("string 4 matches == " + (strMyString == str4).ToString());
    
            var str5 = strMyString.Replace(Environment.NewLine, "\r");
            Console.WriteLine("string 4 matches == " + (strMyString == str5).ToString());
    
            /////////
            Console.WriteLine("\n\n");
            strENL = "";
            ASCIIValues = System.Text.Encoding.ASCII.GetBytes(Environment.NewLine);
    
            foreach (byte b in ASCIIValues)
            {
                strENL += b;
            }
            Console.WriteLine("Environment.NewLine is as ascii: " + strENL);
    
            /////////
    
    
            Console.WriteLine("\n\n");
            Console.WriteLine((Environment.NewLine == "\n").ToString());
            Console.WriteLine((Environment.NewLine == "\r").ToString());
            Console.WriteLine((Environment.NewLine == "\r\n").ToString());      
    

    【讨论】:

    • Environment.NewLine 依赖于平台(正如名称所暗示的那样!),其值记录在 MSDN
    • 确实如此。注意换行符本身是如何变化的。在 VS 中是“\r\n”。在 DotNetFiddle 中,它是单独的 "\n"。
    • @Vache -- 我喜欢这些数据处理的细节 :) ...我发现了如何重现 Fernando 的行为...在本地复制粘贴,例如 Notepad++ 强制结尾为 \n (“UNIX/OSX”)。
    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多