【问题标题】:Escaping double quotes within String.Format in C#在 C# 中的 String.Format 中转义双引号
【发布时间】:2015-07-23 07:08:15
【问题描述】:

我正在尝试将 Parameter 元素的“Id”属性用双引号括起来。我首先尝试简单地逃避引用,这是我尝试实现的第一件事:

buffer = String.Format("{0}" + "<Parameter Id=" + "{1}" + ">" + "{2}" + "</Parameter>", buffer, id, param);

通过上面的代码我得到了这个,你可以看到转义字符和引号一起显示:

<Conquest><User>ArchElf</User><Token>0123456789012345678901234567890</Token><Command>validate</Command><Parameter Id=\"1\">Gemstone3</Parameter>

我的第二次尝试是基于我在 IRC 上收到的建议,一位同事建议我可以使用 '"' 来获取我的报价单,唉:

buffer = String.Format("{0}" + "<Parameter Id=" + "&quot;" + "{1}" + "&quot;" + ">" + "{2}" + "</Parameter>", buffer, id, param);

这个方法在最终结果中只产生了字面量 '"' 字符串:

<Conquest><User>ArchElf</User><Token>0123456789012345678901234567890</Token><Command>validate</Command><Parameter Id=&quot;1&quot;>Gemstone3</Parameter>

无奈之下,我只好在字符串中添加了文字双引号。

我这样做是因为我在This Codeproject Article 上读到,我需要担心转义的 String.Format 中唯一的字符是花括号,而且(惊喜,惊喜)这甚至不能编译,有和没有前面的@。对我大喊一大堆错误,包括:

只有赋值、调用、递增、递减、等待和新对象表达式可以用作语句 ;预期的 ) 预期的 ...等等

对于此事的任何帮助将不胜感激。我知道这一定是我想念的微不足道的东西,最好的难题。 :/

这是整个 BuildCommand 方法:

public string BuildCommand(string _command, string[] _parameters = null)
    {
        int id = 1;
        string buffer = String.Format("<Conquest><User>"+"{0}"+"</User><Token>"+"{1}"+"</Token><Command>"+"{2}"+"</Command>", _playerName, _token, _command);
        if (_parameters != null)
        {
            foreach (string param in _parameters)
            {
                if (param.Length < 1 || param == null)
                    break;
                buffer = String.Format("{0}" + "<Parameter Id=" + "{1}" + ">" + "{2}" + "</Parameter>", buffer, id, param);

                // buffer = String.Format(@"""{0}""<Parameter Id=""{1}"">""{2}""</Parameter>", buffer, id, param);
                id += 1;
            }
        }

【问题讨论】:

  • 您的示例与实际发生的情况不符。以您的第一个示例为例:如果您实际运行该代码,您会得到:dotnetfiddle.net/rkXISA 这不是您报告的内容。所以其他一些奇怪的事情正在发生。也许你的 'id' 变量是一个已经包含引号的字符串?
  • 您是否从调试器中看到了这个值?因为,它确实显示了字符串中不存在的转义字符。当您单击眼镜图标时,它们是否仍会出现?或者在调试工具之外打印/显示它们? id 是字符串还是整数?如果它是一个字符串,您是否确定它本身不包含引号?
  • 这是我的价值观。 &lt;Conquest&gt;&lt;User&gt;ArchElf&lt;/User&gt;&lt;Token&gt;0123456789012345678901234567890&lt;/Token&gt;&lt;Command&gt;Validate&lt;/Command&gt;&lt;Parameter Id=1&gt;Gemstone3&lt;/Parameter&gt;&lt;/Conquest&gt;\r\n
  • @BackSlashAttack 那么你正在做一些超出你给我们的代码的事情。例如,您还没有告诉我们在您显示的内容和打印它之间的字符串会发生什么。

标签: c# xml string escaping


【解决方案1】:

你可以用正确的方式做到这一点

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //<Conquest><User>ArchElf</User><Token>0123456789012345678901234567890</Token><Command>validate</Command><Parameter Id=\"1\">Gemstone3</Parameter>

            string user = "ArchElf";
            string token = "0123456789012345678901234567890";
            string command = "validate";
            int id = 1;
            string value = "Gemstrone3";
            XElement conquest = new XElement("Conquest");

            conquest.Add(new XElement("User", user));

            conquest.Add(new XElement("Token", token));

            conquest.Add(new XElement("Command", command));

            XElement e_parameter = new XElement("Parameter", value);
            e_parameter.Add(new XAttribute("Id", id));
            conquest.Add(e_parameter);
        }
    }
}
​

【讨论】:

  • 我明白这一点,我没有这样做是有原因的。谢谢你的意见。我真的很想找出原始问题的答案。
  • 我不相信重新发明轮子。
  • 嗯,我这样做的原因是最初我正在构建 XElements,但是,我与之通信的服务器不相信使用 XML 前缀、定义版本或命名空间。最初的程序员编写它是为了期望没有这些元素的数据,我无法找到一种方法来删除 XML 的这些部分而不构建这样的字符串。所以要么重写原始服务器代码,用我不知道的语言 C 编写,以适应这一点。或相应地构建字符串
  • 如您所见,我的代码中的 xml linq 既不生成前缀也不生成命名空间。你的解决方案是方轮,我的是圆轮。
【解决方案2】:

你必须用\ 转义"

String.Format("\"{0}\"<Parameter Id=\"{1}\">\"{2}\"</Parameter>", buffer, id, param);

您也可以使用逐字字符串文字,然后您必须使用双引号:

String.Format(@"""{0}""<Parameter Id=""{1}"">""{2}""</Parameter>", buffer, id, param);

【讨论】:

  • 感谢您的及时回复。我尝试使用您的建议,使用您的代码将 " 与 \ 一起转义,并且收到与执行相同操作时相同的响应。"\"&lt;Conquest&gt;&lt;User&gt;ArchElf&lt;/User&gt;&lt;Token&gt;0123456789012345678901234567890&lt;/Token&gt;&lt;Command&gt;validate&lt;/Command&gt;\"&lt;Parameter Id=\"1\"&gt;\"Gemstone3\"&lt;/Parameter&gt;" \ 字面意思出现在字符串中。使用第二个建议,我得到了几乎相同的结果,斜线仍然出现在我的字符串中。
  • @BackSlashAttack 您必须在调试器中查看字符串,这为您的舒适和方便添加额外的反斜杠(或者您将其传递给另一段代码在打印之前添加反斜杠)。正如另一条评论中所建议的那样,将其打印出来或使用放大镜图标以纯粹的原始形式查看字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多