在C#中往返安全地转义字符串

时间:2015-03-17 18:15:03

标签: c# mono escaping

我对C#中字符串的所有不同转义机制感到困惑。我想要的是一种逃避/失败的方法:

1)可用于任何字符串
2)escape + unescape保证返回初始字符串 3)用其他东西替换所有标点符号。如果要求太多,那么至少要逗号,大括号和@。没有逃脱的空间我很好 4)不太可能改变。

它存在吗?

编辑:这是为了对应用程序生成的属性进行seriliazing和反序列化。所以我的对象可能有也可能没有Attribute1,Attribute2,Attribute3等的值。简化一点,想法是做类似下面的事情。目标是使编码的集合简洁并且或多或少是人类可读的。

我在问Escape和Unescape使用哪些方法有意义。

public abstract class GenericAttribute {
  const string key1 = "KEY1";  //It is fine to put some restrictions on the keys, i.e. no punctuation
  const string key2 = "KEY2";
  public abstract string Encode(); // NO RESTRICTIONS ON WHAT ENCODE MIGHT RETURN
  public static GenericAttribute FromKeyValuePair (string key, string value) {
    switch (key) {
      case key1: return new ConcreteAttribute1(value);
      case key2: return new ConcreteAttribute2(value);
        // etc.
    }
  }
}

public class AttributeCollection {
  Dictionary <string, GenericAttribute> Content {get;set;}
  public string Encode() {
    string r = "";
    bool first = true;
    foreach (KeyValuePair<string, GenericAttribute> pair in this.Content) {
      if (first) {
        first = false;
      } else {
        r+=",";
      }
      r+=(pair.Key + "=" + Escape(pair.Value.Encode()));
    }
    return r;
  }

  public AttributeCollection(string encodedCollection) {
    // input string is the return value of the Encode method
    this.Content = new Dictionary<string, GenericAttribute>();
    string[] array = encodedCollection.Split(',');
    foreach(string component in array) {
      int equalsIndex = component.IndexOf('=');
      string key = component.Substring(0, equalsIndex);
      string value = component.Substring(equalsIndex+1);
      GenericAttribute attribute = GenericAttribute.FromKeyValuePair(key, Unescape(value));
      this.Content[key]=attribute;
    }
  }
}

2 个答案:

答案 0 :(得分:0)

我不完全确定你的要求,但我相信你的意图是将逃脱的角色包括在内,即使逃跑也是如此。

var content = @"\'Hello";
Console.WriteLine(content);

// Output:
\'Hello

通过使用@,它将包含所述转义,使其与string分开。对于带有C#的服务器端来说,只考虑其他语言和转义格式,你才会知道。

你可以在这里找到关于C#转义的一些很好的信息:

答案 1 :(得分:0)

尝试使用HttpServerUtility.UrlEncodeHttpServerUtility.UrlDecode。我认为这将编码和解码你想要的所有东西。 请参阅MSDN Docs,以下是Wikipedia上的映射说明。