用于分隔字符串的逗号分隔符是什么?

Kin*_*tor 23 c# delimited-text

我有几个文本框,用户可以在其中输入信息.这可以包括逗号,所以我不能使用标准的逗号分隔字符串.

什么是一个好的分隔符来表示字符串应该基于用户在其着作中通常不使用的字符来分隔?我将把这些字段组合成一个字符串字符串并将它们传递给我的加密方法.在解密它们之后,我需要能够可靠地分离它们.

如果重要的话,我正在使用C#.

Cha*_*ant 27

| 将列在我的列表中,通常用作CSV的替代品.google"pipe delimited",你会发现很多例子.

string[] items = new string[] {"Uno","Dos","Tres"};

string toEncrypt = String.Join("|", items);

items = toEncrypt.Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);

foreach(string s in items)
  Console.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)

因为每个人都喜欢成为编码的批评者并且不提供代码,所以这里有一种编码文本的方法,所以你的| delim不会碰撞.

string[] items = new string[] {"Uno","Dos","Tres"};

for (int i = 0; i < items.Length; i++)
    items[i] = Convert.ToBase64String(Encoding.UTF8.GetBytes(items[i]));

string toEncrypt = String.Join("|", items);

items = toEncrypt.Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries);

foreach (string s in items)
     Console.WriteLine(Encoding.UTF8.GetString(Convert.FromBase64String(s)));
Run Code Online (Sandbox Code Playgroud)

  • 这仍然依赖于导致安全错误的一厢情愿的想法.希望没有用户会输入| 只是不削减它.无论分隔符如何,都必须支持转义.那个,或者必须阻止分隔符,以便用户根本不能输入它们. (16认同)
  • 这个例子就是一个例子.当锤子更合适时,可能会使用大锤.然而,至少这个线程中的人试图帮助解决他的问题,而你挑剔并没有破坏一行代码.Base64是合适的,并且在web开发中使用了ALOT ......所以希望他能比你从中学到更多.还有另外两个人在这个帖子中提供了foreach(char),所以我做了第三个选择.教学选择很重要.你无法使用List <T>解决所有问题 (2认同)

Guf*_*ffa 16

我已经看到异常字符被用作分隔符,甚至是异常的字符组合-|::|-,但是尽管它们更不可能发生,但它们仍然可以.

如果你想要防水,你基本上有两个选择:

1:使用无法输入的字符,例如'\ 0'字符:

加入:

string combined = string.Join("\0", inputArray);
Run Code Online (Sandbox Code Playgroud)

分裂:

string[] result = combined.Split('\0');
Run Code Online (Sandbox Code Playgroud)

2:转义字符串并使用转义字符作为分隔符,如url编码值并使用&作为分隔符:

加入:

string combined = string.Join("&", inputArray.Select<string,string>(System.Web.HttpUtility.UrlEncode).ToArray());
Run Code Online (Sandbox Code Playgroud)

分裂:

string[] result = combined.Split('&').Select<string,string>(System.Web.HttpUtility.UrlDecode).ToArray();
Run Code Online (Sandbox Code Playgroud)


0x0*_*01h 11

如果您想使用真正独特的分隔符,我会推荐\xe2\x95\xa1or unique string \\u2561

\n


Mar*_*ett 8

自从我停止使用C以来,我不认为自己已经自愿划分了一系列字符串.没有必要使用"现代"语言,而且 - 虽然微不足道 - 边缘情况的数量足以惹恼你致死

将它们存储在List <string>或string []中,并对它们进行序列化/反序列化.如果您想要人类可读性或互操作,请使用XML - 如果不需要,则使用二进制序列化.您可以轻松地加密输出,并且没有歧义或创建您自己的转义例程.

在C#中,它的LOC较少,写入时间比这个答案要少.没有理由推出自己的解决方案.


mP.*_*mP. 7

最好的解决方案是坚持使用逗号并引入对字符转义的支持.无论您选择哪种角色最终都需要输入,因此您也可以为此提供支持.

在双引号字符串中思考反向语言+双引号.

不要选择像反引号这样的字符,因为有些用户可能不知道如何键入它...


Luk*_*keH 5

用户会在文本框中输入分隔字符串,还是会输入单个字符串,然后由您的代码将这些字符串内置到分隔字符串中?

在第一种情况下,最好重新考虑您的 UI。例如,用户可以一次在文本框中输入一个字符串,然后在每个字符串后单击“添加到列表”按钮。

在第二种情况下,您使用什么分隔符并不重要。选择您喜欢的任何字符,只需确保您避开该字符的任何其他出现。

编辑

由于对其他答案的一些评论要求提供代码,因此这里有一种创建逗号分隔字符串的方法,使用反斜杠作为转义字符:

public static string CreateDelimitedString(IEnumerable<string> items)
{
    StringBuilder sb = new StringBuilder();

    foreach (string item in items)
    {
        sb.Append(item.Replace("\\", "\\\\").Replace(",", "\\,"));
        sb.Append(",");
    }

    return (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : string.Empty;
}
Run Code Online (Sandbox Code Playgroud)

这是将逗号分隔的字符串转换回单个字符串集合的方法:

public static IEnumerable<string> GetItemsFromDelimitedString(string s)
{
    bool escaped = false;
    StringBuilder sb = new StringBuilder();

    foreach (char c in s)
    {
        if ((c == '\\') && !escaped)
        {
            escaped = true;
        }
        else if ((c == ',') && !escaped)
        {
            yield return sb.ToString();
            sb.Remove(0, sb.Length);
        }
        else
        {
            sb.Append(c);
            escaped = false;
        }
    }

    yield return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

这是一些示例用法:

string[] test =
    {
        "no commas or backslashes",
        "just one, comma",
        @"a comma, and a\ backslash",
        @"lots, of\ commas,\ and\, backslashes",
        @"even\\ more,, commas\\ and,, backslashes"
    };

    string delimited = CreateDelimitedString(test);
    Console.WriteLine(delimited);

    foreach (string item in GetItemsFromDelimitedString(delimited))
    {
        Console.WriteLine(item);
    }
Run Code Online (Sandbox Code Playgroud)