使用C#对文本字符串进行编码,带换行符。

66

我有一个字符串,我将其写入响应的输出流。在保存此文档并在Notepad++或WordPad中打开它后,我会得到漂亮的格式化换行符,并且它们所在的位置是正确的。但是,当我使用常规的Windows记事本打开此文档时,我会得到一个长文本串,其中应该有换行符的地方会显示为□(类似于方块的符号)。

有没有人有过这样的经历?

6个回答

124

是的 - 这意味着您正在使用 \n 作为换行符,而不是 \r\n。Notepad 只能理解后者。

(请注意,其他人建议使用 Environment.NewLine 如果您想要平台默认值 - 但是如果您正在从 Mono 提供服务并且绝对需要 \r\n,则应明确指定它。)


谢谢Jon。"从Mono提供服务"?那是什么? - jim
3
就像这样,“使用Mono在Linux上部署服务器,并要求该服务器提供数据。” Mono是.NET的跨平台实现 - 请参见http://mono-project.com。 - Jon Skeet

24

14

试试这个:

string myStr = ...
myStr = myStr.Replace("\n", Environment.NewLine)

9
如果输入的字符串既包含 "\n" 又包含 "\r\n",这种操作将会导致其断开。 - abatishchev
我得到了一个长文本字符串,其中包含[]方形符号,应该是换行符。看起来情况并非如此。 - Guillaume
7
@Guillaume:这次不是这样的情况,但一个文件包含两种或更多不同类型的行分隔符也是可能的--我经常在网页中看到。在归一化换行符时,你应该始终匹配所有三种类型:Regex.Replace(@"\n|\r\n?", "\r\n") - Alan Moore
1
当您从非标准源规范化换行符时可以使用正则表达式。但是,如果您确定只有'\n',则不需要使用正则表达式。 - Guillaume

2

同时:

string s = $"first line{Environment.NewLine}second line";

2
尝试一下 \n\n,它会起作用的! :)
public async Task AjudaAsync(IDialogContext context, LuisResult result){
       await context.PostAsync("How can I help you? \n\n 1.To Schedule \n\n 2.Consult");
       context.Wait(MessageReceived);
}

我不理解你奇怪任务与主题之间的联系。 - The incredible Jan

0

如前所述,最好使用Environment.NewLine
\n代表换行符,在类Unix系统(如Linux和macOS)和许多编程语言中常用于换行。

Environment.NewLine是一个特定于平台的字符串,表示当前操作系统的换行序列。它会自动适应代码运行平台上使用的换行约定。在Windows上,Environment.NewLine等同于\r\n,而在类Unix系统上,则等同于\n


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接