Adr*_*der 53
我们目前使用
public const char Separator = ((char)007);
Run Code Online (Sandbox Code Playgroud)
如果我没有记错的话,我想这就是哔哔声.
nd.*_*nd. 20
除了可能不可用的0x0(例如,由于以空字符结尾的字符串),0x1和0x1f之间的ASCII控制字符是很好的候选者.ASCII字符0x1c-0x1f甚至是为这样的东西而设计的,其名称为File Separator,Group Separator,Record Separator,Unit Separator.但是,它们是以XML等传输格式禁止的.
在这种情况下,可以使用来自unicode专用代码点的字符.
最后一个选择是使用转义策略,以便无论如何都可以以某种方式输入分隔字符.但是,这使任务变得非常复杂,你不能再使用String.Split了.
Guf*_*ffa 19
如果你转义字符串,你可以安全地使用你喜欢的任何字符作为分隔符,这样你就知道它不包含那个字符.
例如,我们选择字符'a'作为分隔符.(我故意挑选一个通常的角色来表明可以使用任何角色.)
使用字符'b'作为转义码.我们用"b1"替换任何出现的'a',用'b2'替换出'b':
private static string Escape(string s) {
return s.Replace("b", "b2").Replace("a", "b1");
}
Run Code Online (Sandbox Code Playgroud)
现在,该字符串不包含任何"a"字符,因此您可以将其中的几个字符串放在一起:
string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark");
Run Code Online (Sandbox Code Playgroud)
字符串现在看起来像这样:
b2b1nb1nb1ab1b1rdvb1rkab2b1rk
Run Code Online (Sandbox Code Playgroud)
现在,您可以将字符串拆分为"a"并获取各个部分:
b2b1nb1nb1
b1b1rdvb1rk
b2b1rk
Run Code Online (Sandbox Code Playgroud)
要解码部件,请向后执行替换:
private static string Unescape(string s) {
return s.Replace("b1", "a").Replace("b2", "b");
}
Run Code Online (Sandbox Code Playgroud)
因此拆分字符串并取消编码部分就像这样:
string[] parts = msg.split('a');
for (int i = 0; i < parts.length; i++) {
parts[i] = Unescape(parts[i]);
}
Run Code Online (Sandbox Code Playgroud)
或者使用LINQ:
string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray();
Run Code Online (Sandbox Code Playgroud)
如果选择较不常见的字符作为分隔符,则当然会减少将被转义的事件.关键是该方法确保该字符可以安全地用作分隔符,而不会对要放入字符串的数据中存在哪些字符进行任何假设.
\ 0是一个很好的分裂角色.从键盘进入是非常困难的(不可能?),这是合乎逻辑的.
在某些情况下,\n是另一个好的候选人.
当然,.Net字符串是unicode,不需要用前255个限制自己.您可以使用罕见的蒙古字母或一些保留或未使用的Unicode符号.
这取决于你分裂的内容.
例如,在大多数情况下,最好使用相当常用的拆分字符
价值,价值,价值
值|值|值
键=值;键=值;
键:值;密钥:值;
您可以使用逗号引用标识符:
"价值","价值","价值与内部","价值"
我倾向于首先使用,,然后|,如果我不能使用其中任何一个,我使用section-break char§
请注意,您可以键入任何ASCII字符ALT+number(仅限数字键盘),§也可以ALT+21