C# 转义序列引入了不需要的反斜杠,同时从 Web API 控制器返回字符串
C# Escape sequence introduces unwanted backslash, while returning string from Web API Controller
我正在尝试做一些非常简单的事情。
string img = "sadadsasdsa";
string res = @"<image src=""data:img/jpg;base64," + img + @"""/>";
我得到的输出是 <image src=\"data:img/jpg;base64,sadadsasdsa\"/>
虽然我想要的输出是 <image src="data:img/jpg;base64,sadadsasdsa"/>
我不希望在数据之前和末尾添加意外的“\”。
我什至尝试使用反斜杠作为转义序列
string res = "<image src=\"data:img/jpg;base64," + img + "\"/>";
我仍然得到相同的输出。我在这里错过了什么?
好的,当我使用 console.writeline 打印上面的 'res' 字符串时,我没有得到神奇的斜线。但是当我在调试器中查看它时,我确实看到了它。当我 return 来自 Web API 值控制器的字符串时,我仍然看到它。我想这与字符串文字的解析有关
[HttpGet]
[Route("api/quotes/image")]
public string ImageString()
{
string imgg = "sadadsasdsa" + "\"";
string ress = @"<image src=""data:img/jpg;base64," + imgg + "/>";
return ress;
}
当我尝试使用 Console.WriteLine 打印字符串时,我没有看到不需要的反斜杠。但我确实在调试器中看到了它,当 return 从 WebAPI 控制器中读取字符串时,如上。
字符串 'res' 似乎损坏了。但是,您可以选择使用字符串格式吗?例如:
string img = "sadadsasdsa";
string actual = string.Format(
CultureInfo.InvariantCulture,
"<image src=\"data:img/jpg;base64,{0}\"/>",
img);
string expected = "<image src=\"data:img/jpg;base64,sadadsasdsa\"/>";
编辑
这是一个代码片段,其中 return 是您最初问题的串联字符串:
public class ValuesController : ApiController
{
public IEnumerable<string> Get()
{
// your string concat
string img = "sadadsasdsa";
string actual = string.Format(
CultureInfo.InvariantCulture,
"<image src=\"data:img/jpg;base64,{0}\"/>",
img);
// DEBUG ONLY - for simplicity use ASCII encoding
Encoding enc = Encoding.ASCII;
foreach (byte b in enc.GetBytes(actual))
{
// write bytes and characters
Debug.WriteLine(b.ToString("X2") + " " + enc.GetString(new byte[] {b}));
}
return new string[] { actual };
}
在调试 window 中,您会看到字符串 'actual' 不 包含反斜杠 (0x5C),如您所愿:
3C <
69 i
6D m
61 a
67 g
65 e
20
73 s
72 r
63 c
3D =
22 "
64 d
61 a
74 t
61 a
3A :
69 i
6D m
...
收到的 HTTP 响应包含由 JSON 序列化程序引入的转义 double-quotes。由于双引号在 JSON 中有意义,因此必须在 JSON 值中对它们进行转义。这可以在 Fiddler Response Raw 视图中观察到:
Content-Type: application/json; charset=utf-8
["<image src=\"data:img/jpg;base64,sadadsasdsa\"/>"]
反序列化后,响应包含没有反斜杠的字符串。这可以在 Fiddler Response JSON 视图中观察到。 (我使用 Fiddler 4.6.2.0)
大体相关:question 9462425
您也可以使用 Postman(Chrome 扩展)查看此内容,这对于更改 HTTP 请求很有用 'Accept' header。 'application/json' 会 return 你 JSON,'application/xml' 会 return 你 XML。两种格式在序列化时具有截然不同的外观。玩弄 Accept header 并查看结果响应说明了需要转义有意义的字符的要点。
如果这有帮助,请您删除反对票好吗?
这是标准的调试器行为。你会得到这个:
调试时,这:
在控制台上。
有关详细信息,请参阅:Can the Visual Studio Debugger display strings unquoted/unescaped?。
我正在尝试做一些非常简单的事情。
string img = "sadadsasdsa";
string res = @"<image src=""data:img/jpg;base64," + img + @"""/>";
我得到的输出是 <image src=\"data:img/jpg;base64,sadadsasdsa\"/>
虽然我想要的输出是 <image src="data:img/jpg;base64,sadadsasdsa"/>
我不希望在数据之前和末尾添加意外的“\”。
我什至尝试使用反斜杠作为转义序列
string res = "<image src=\"data:img/jpg;base64," + img + "\"/>";
我仍然得到相同的输出。我在这里错过了什么?
好的,当我使用 console.writeline 打印上面的 'res' 字符串时,我没有得到神奇的斜线。但是当我在调试器中查看它时,我确实看到了它。当我 return 来自 Web API 值控制器的字符串时,我仍然看到它。我想这与字符串文字的解析有关
[HttpGet]
[Route("api/quotes/image")]
public string ImageString()
{
string imgg = "sadadsasdsa" + "\"";
string ress = @"<image src=""data:img/jpg;base64," + imgg + "/>";
return ress;
}
当我尝试使用 Console.WriteLine 打印字符串时,我没有看到不需要的反斜杠。但我确实在调试器中看到了它,当 return 从 WebAPI 控制器中读取字符串时,如上。
字符串 'res' 似乎损坏了。但是,您可以选择使用字符串格式吗?例如:
string img = "sadadsasdsa";
string actual = string.Format(
CultureInfo.InvariantCulture,
"<image src=\"data:img/jpg;base64,{0}\"/>",
img);
string expected = "<image src=\"data:img/jpg;base64,sadadsasdsa\"/>";
编辑 这是一个代码片段,其中 return 是您最初问题的串联字符串:
public class ValuesController : ApiController
{
public IEnumerable<string> Get()
{
// your string concat
string img = "sadadsasdsa";
string actual = string.Format(
CultureInfo.InvariantCulture,
"<image src=\"data:img/jpg;base64,{0}\"/>",
img);
// DEBUG ONLY - for simplicity use ASCII encoding
Encoding enc = Encoding.ASCII;
foreach (byte b in enc.GetBytes(actual))
{
// write bytes and characters
Debug.WriteLine(b.ToString("X2") + " " + enc.GetString(new byte[] {b}));
}
return new string[] { actual };
}
在调试 window 中,您会看到字符串 'actual' 不 包含反斜杠 (0x5C),如您所愿:
3C <
69 i
6D m
61 a
67 g
65 e
20
73 s
72 r
63 c
3D =
22 "
64 d
61 a
74 t
61 a
3A :
69 i
6D m
...
收到的 HTTP 响应包含由 JSON 序列化程序引入的转义 double-quotes。由于双引号在 JSON 中有意义,因此必须在 JSON 值中对它们进行转义。这可以在 Fiddler Response Raw 视图中观察到:
Content-Type: application/json; charset=utf-8
["<image src=\"data:img/jpg;base64,sadadsasdsa\"/>"]
反序列化后,响应包含没有反斜杠的字符串。这可以在 Fiddler Response JSON 视图中观察到。 (我使用 Fiddler 4.6.2.0)
大体相关:question 9462425
您也可以使用 Postman(Chrome 扩展)查看此内容,这对于更改 HTTP 请求很有用 'Accept' header。 'application/json' 会 return 你 JSON,'application/xml' 会 return 你 XML。两种格式在序列化时具有截然不同的外观。玩弄 Accept header 并查看结果响应说明了需要转义有意义的字符的要点。
如果这有帮助,请您删除反对票好吗?
这是标准的调试器行为。你会得到这个:
调试时,这:
在控制台上。
有关详细信息,请参阅:Can the Visual Studio Debugger display strings unquoted/unescaped?。