dotnetfiddle.net 在某些情况下将换行符生成为 \n 而不是 \r\n
dotnetfiddle.net produces newline as \n instead of \r\n in some cases
在测试 dotnetfiddle.net 中的一些片段时,我注意到了一个奇怪的现象。
如果 verbatim string literal(字符串从 @"
开始)包含换行符,编译器在输出字符串中将换行符作为 \n
而不是 \r\n
。 (例如 Environment.NewLine
在所有情况下都会生成 \r\n
)。
下面的示例代码也可以在 https://dotnetfiddle.net/53qGTM:
中找到
string verbatimString = @"L1
L2";
string normalString = @"L1" + Environment.NewLine + "L2";
Console.WriteLine("=====Verbatim=====");
foreach (char c in verbatimString)
{
Console.WriteLine("ascii:" + (int)c + ", char:" + c);
}
Console.WriteLine("=====Normal=====");
foreach (char c in normalString)
{
Console.WriteLine("ascii:" + (int)c + ", char:" + c);
}
输出:
=====Verbatim=====
ascii:76, char:L
ascii:49, char:1
ascii:10, char:
ascii:76, char:L
ascii:50, char:2
=====Normal=====
ascii:76, char:L
ascii:49, char:1
ascii:13, char:
ascii:10, char:
ascii:76, char:L
ascii:50, char:2
在 Visual Studio 中编译相同的代码时,换行符在两种情况下都是正确的 \r\n
。它似乎是 dotnetfiddle-compiler 中的错误,是这样吗?
在做一些调查的同时,我也做了一个假设,我也会首先回答这个问题as recommended。
dotnetfiddle.net在后端执行代码编译和执行。当 运行 代码片段时,代码编辑器 Web 视图将代码作为 json 发送到后端,并作为 json 接收输出。
作为我的代码执行的一部分,发送了以下 json 字符串(在 chrome 开发工具中获取):
"CodeBlock": "using System;\n\npublic class Program\n{\n\tpublic static void Main()\n\t{\n\t\tstring verbatimString = @\"L1\nL2\";\n\t\tstring normalString = @\"L1\" + Environment.NewLine + \"L2\";\n\t\tConsole.WriteLine(\"=====Verbatim=====\");\n\t\tforeach (char c in verbatimString)\n\t\t{\n\t\t\tConsole.WriteLine(\"ascii:\" + (int)c + \", char:\" + c);\n\t\t}\n\n\t\tConsole.WriteLine(\"=====Normal=====\");\n\t\tforeach (char c in normalString)\n\t\t{\n\t\t\tConsole.WriteLine(\"ascii:\" + (int)c + \", char:\" + c);\n\t\t}\n\t}\n}"
在 json 的一部分中,我的 verbatingString
-变量定义如下: string verbatimString = @\"L1\nL2\";
我的字符串文字中嵌入了标准 json 换行符 \n
。似乎 dotnetfiddle 后端对给定的字符串文字没有任何转换。 它按字面意思接受字符串文字(双关语意)。
在测试 dotnetfiddle.net 中的一些片段时,我注意到了一个奇怪的现象。
如果 verbatim string literal(字符串从 @"
开始)包含换行符,编译器在输出字符串中将换行符作为 \n
而不是 \r\n
。 (例如 Environment.NewLine
在所有情况下都会生成 \r\n
)。
下面的示例代码也可以在 https://dotnetfiddle.net/53qGTM:
中找到string verbatimString = @"L1
L2";
string normalString = @"L1" + Environment.NewLine + "L2";
Console.WriteLine("=====Verbatim=====");
foreach (char c in verbatimString)
{
Console.WriteLine("ascii:" + (int)c + ", char:" + c);
}
Console.WriteLine("=====Normal=====");
foreach (char c in normalString)
{
Console.WriteLine("ascii:" + (int)c + ", char:" + c);
}
输出:
=====Verbatim=====
ascii:76, char:L
ascii:49, char:1
ascii:10, char:
ascii:76, char:L
ascii:50, char:2
=====Normal=====
ascii:76, char:L
ascii:49, char:1
ascii:13, char:
ascii:10, char:
ascii:76, char:L
ascii:50, char:2
在 Visual Studio 中编译相同的代码时,换行符在两种情况下都是正确的 \r\n
。它似乎是 dotnetfiddle-compiler 中的错误,是这样吗?
在做一些调查的同时,我也做了一个假设,我也会首先回答这个问题as recommended。
dotnetfiddle.net在后端执行代码编译和执行。当 运行 代码片段时,代码编辑器 Web 视图将代码作为 json 发送到后端,并作为 json 接收输出。
作为我的代码执行的一部分,发送了以下 json 字符串(在 chrome 开发工具中获取):
"CodeBlock": "using System;\n\npublic class Program\n{\n\tpublic static void Main()\n\t{\n\t\tstring verbatimString = @\"L1\nL2\";\n\t\tstring normalString = @\"L1\" + Environment.NewLine + \"L2\";\n\t\tConsole.WriteLine(\"=====Verbatim=====\");\n\t\tforeach (char c in verbatimString)\n\t\t{\n\t\t\tConsole.WriteLine(\"ascii:\" + (int)c + \", char:\" + c);\n\t\t}\n\n\t\tConsole.WriteLine(\"=====Normal=====\");\n\t\tforeach (char c in normalString)\n\t\t{\n\t\t\tConsole.WriteLine(\"ascii:\" + (int)c + \", char:\" + c);\n\t\t}\n\t}\n}"
在 json 的一部分中,我的 verbatingString
-变量定义如下: string verbatimString = @\"L1\nL2\";
我的字符串文字中嵌入了标准 json 换行符 \n
。似乎 dotnetfiddle 后端对给定的字符串文字没有任何转换。 它按字面意思接受字符串文字(双关语意)。