【问题标题】:Why does StringBuilder.AppendLine not add a new line with some strings?为什么 StringBuilder.AppendLine 不添加带有某些字符串的新行?
【发布时间】:2012-06-24 17:29:53
【问题描述】:

我正在尝试使用 stringbuilder 创建要在文本(不是 HTML)电子邮件中使用的字符串正文。但是有些行(我包含动态数据,没有添加新行,但在某些行中,换行符按预期工作。

在使用 stringbuilder 类时我是否缺少一些基本的东西,或者应该发生一些更基本的过程?

在下面的代码中:

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
sbUser.AppendLine();
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine();

(ContentPage 和 thisEvent 是使用 Subsonic(v2) 构建的自定义类。PageTitle 是字符串的输出类型)

将其作为输出:

    Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com

Selected event : My Event Date of event : 16 Sept 2012 ==============================================================

如您所见,代码中第 3 行之后的所有内容都使所有内容继续到一行。

但是,我使用的代码再往下看:

sbRR.AppendLine("First name : " + txtFirstname.Text.Trim());
sbRR.AppendLine("Surname : " + txtSurname.Text.Trim());
etc,

所有这些都正确地出现在单独的行上。我不明白为什么会这样。

电子邮件是这样组成的

mailMessage.Body = sbUser.ToString() + sbRR.ToString();


添加以下代码:

sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle + Environment.NewLine); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy") + Environment.NewLine);

产生以下输出:

Selected event : My Event

Date of event : 16 Sept 2012

==============================================================

我想这是可行的,除了它添加了 2 个换行符(AppendLine 和 Environment.NewLine)。似乎将数据直接从数据库中提取到 stringbuilder 似乎会弄乱行尾。即使我在数据库拉取后添加文本,它仍然保持在一行。

更新

在做 StringBuilder.Append("blah"+Environment.NewLine) 产生了正确的结果,但是我仍然不明白为什么它会起作用并且.AppendLine("blah"+<database content>) 不起作用。

【问题讨论】:

  • 在 sbUser.ToString() 调用之后你对字符串做了什么吗?
  • PageTitle 是否有可能返回可能中断文本流的奇怪值?或者被调用的代码会暂时改变文化或换行设置?换句话说,如果你硬编码“我的事件”,问题是否仍然存在? 编辑猜你的编辑答案证实了怀疑;)
  • 您可以尝试使用默认容量创建 StringBuilder 吗?例如:StringBuilder sb = new StringBuilder(1024);
  • @Me.Name 返回数据的数据库的排序规则为SQL_Latin1_General_CP1_CI_AS,列数据类型为nvarchar(150) 不确定为什么这会改变文化(英文),尽管数据库服务器的语言是english (US)
  • @Steve - 这会有什么不同?

标签: c# .net newline stringbuilder


【解决方案1】:

Windows 10 Insider Preview Build 15007。默认行终止符和Environment.NewLine 都是"\n"。要使用 "\r\n",我必须创建一个字符串常量并改为使用它。

【讨论】:

  • 我有一种感觉,这样的事情永远不会发生,因为那将是一个突破性的变化。您使用的是 .Net Core 而不是 .Net Framework 之类的吗?当目标是 4.6.2 时,我在 build 16199 .Net Framework 上得到 CRLF。
【解决方案2】:

我知道这个问题已经过时并且已被标记为已回答,但我想我会在此处添加此问题,以防其他人遇到此问题,因为这是在 Google 上首次点击 StringBuilder.AppendLine() 不起作用。

我遇到了同样的问题,结果证明是 Outlook 问题。 Outlook 通过删除额外的换行符来重新格式化基于文本的电子邮件。您可以在单个电子邮件的标题中单击“我们删除了此邮件中的多余换行符 -> 恢复换行符”,或者更改执行这个讨厌的小技巧的设置"Options->Mail->Message Format->Remove extra line breaks in plain text messages"

我在Newsletter Formatting And The Remove Extra Line Breaks Issue 找到的解决方法(因为您无法控制每个潜在电子邮件目标的设置)。 基本上,如果您在每行的开头添加两个空白字符,Outlook 将不会重新格式化电子邮件。

这是一个帮助的扩展方法(方法名称有点冗长,所以改变你的喜好:))

namespace System.Text
{
    public static class StringBuilderExtensions
    {
        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb, string value)
        {
            sb.AppendFormat("{0}{1}{2}", "  ", value, Environment.NewLine);
        }

        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb)
        {
            sb.AppendFormat("{0}{1}", "  ", Environment.NewLine);
        }
    }
}

【讨论】:

  • 谢谢!它甚至在消息上方说它为我剥离了“不必要的换行符”(我在阅读您的回答后意识到这一点)。很棒的默认行为...我只是这样做了:" " + myString.Replace(Environment.NewLine, Environment.NewLine + " ")
  • 如果邮件格式为 HTML,这实际上似乎不起作用。使用
    标签
    查看http://stackoverflow.com/a/5020512/2788458
  • 在每一行前加上两个空格(这个答案)是正确的答案。仅按照其他答案的建议使用 Environment.NewLine 是行不通的。
【解决方案3】:

首先 sbUser.Appendline();

第二 sbUser.Append("texto loco ");

瞧!

=)

【讨论】:

  • 真的不太清楚你的意思。请格式化您的答案并添加更多解释说明为什么这样做。
【解决方案4】:

代替

sbUser.AppendLine();

尝试使用

sbUser.Append(Environment.NewLine);

不知道为什么会这样......

【讨论】:

  • AppendLine 只是调用 this.Append(Environment.NewLine);
  • 这给出了正确的结果,但为什么这会起作用而不是 AppendLine?
  • 在反编译 StringBuilder 类后,它显示它正在内部执行this.Append(Environment.NewLine);。所以从技术上讲,两者都应该给出相同的结果
  • 我知道这是个问题。在我的机器上,这给出了正确的结果,令人费解。
  • 您只需在 StringBuilder 上调用 ToString(),然后获取新行;)
【解决方案5】:

在每一行之后或你想要换行的地方使用Environment.NewLine

例如:-

  sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com" + Environment.NewLine);
  sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 

【讨论】:

    【解决方案6】:

    使用Environment.NewLine

    sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
    sbUser.AppendLine(Environment.NewLine);
    sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
    sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
    sbUser.AppendLine("==============================================================");
    sbUser.AppendLine(Environment.NewLine);
    

    【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2020-05-19
    • 2011-12-02
    • 2021-12-05
    • 2013-06-14
    • 1970-01-01
    • 2022-08-07
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多