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)
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)
自从我停止使用C以来,我不认为自己已经自愿划分了一系列字符串.没有必要使用"现代"语言,而且 - 虽然微不足道 - 边缘情况的数量足以惹恼你致死
将它们存储在List <string>或string []中,并对它们进行序列化/反序列化.如果您想要人类可读性或互操作,请使用XML - 如果不需要,则使用二进制序列化.您可以轻松地加密输出,并且没有歧义或创建您自己的转义例程.
在C#中,它的LOC较少,写入时间比这个答案要少.没有理由推出自己的解决方案.
最好的解决方案是坚持使用逗号并引入对字符转义的支持.无论您选择哪种角色最终都需要输入,因此您也可以为此提供支持.
在双引号字符串中思考反向语言+双引号.
不要选择像反引号这样的字符,因为有些用户可能不知道如何键入它...
用户会在文本框中输入分隔字符串,还是会输入单个字符串,然后由您的代码将这些字符串内置到分隔字符串中?
在第一种情况下,最好重新考虑您的 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)