最可靠的分割字符

更新

如果你被迫在分割方法上使用单个字符,哪个字符将是最可靠的?

可靠性的定义:不是被拆分的单个子string的一部分的拆分字符。

我们目前使用

 public const char Separator = ((char)007); 

我想这是嘟嘟声,如果我没有弄错的话。

除了0x0(可能不可用)(例如由于以空字符结尾的string)之外,0x1和0x1f之间的ASCII控制字符是很好的select。 ASCII字符0x1c-0x1f甚至devise为这样的事情,并具有名称文件分隔符组分隔符logging分隔符单元分隔符 。 但是,它们在XML等传输格式中是被禁止的。

在这种情况下,可以使用来自unicode私用代码点的字符。

最后一个select是使用转义策略,以便分离字符可以以某种方式进入。 然而,这使得任务复杂化很多,你不能再使用String.Split了。

您可以安全地使用任何您喜欢的字符作为分隔符,如果您转义string,以便您知道它不包含该字符。

举个例子,select“a”作为分隔符。 (我故意select了一个通常的字符来表示可以使用任何字符。)

使用字符'b'作为转义码。 我们用'b1'replace'a'的出现,用'b2'replace出现的'b':

 private static string Escape(string s) { return s.Replace("b", "b2").Replace("a", "b1"); } 

现在,string不包含任何'a'字符,所以你可以把几个string放在一起:

 string msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark"); 

string现在看起来像这样:

 b2b1nb1nb1ab1b1rdvb1rkab2b1rk 

现在,您可以将string拆分为“a”并获取单个部分:

 b2b1nb1nb1 b1b1rdvb1rk b2b1rk 

要解码的部分你做replace倒退:

 private static string Unescape(string s) { return s.Replace("b1", "a").Replace("b2", "b"); } 

因此,拆分string和解密部分是这样做的:

 string[] parts = msg.split('a'); for (int i = 0; i < parts.length; i++) { parts[i] = Unescape(parts[i]); } 

或者使用LINQ:

 string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray(); 

如果您select一个不太常见的字符作为分隔符,那么当然会有更less的事件被转义。 重点是该方法确保该字符可以安全地用作分隔符,而不需要假定要放入string的数据中存在哪些字符。

我通常更喜欢“ |” '符号作​​为分割字符。 如果您不确定用户在文本中input的内容,则可以限制用户input一些特殊字符,您可以从这些字符中select分割字符。

这取决于你正在分裂。

在大多数情况下,最好使用相当常用的拆分字符

价值,价值,价值

值|值|值

键=值;键=值;

键:值;密钥:值;

你可以用逗号很好地使用带引号的标识符:

“价值”,“价值”,“价值与内部”,“价值”

我倾向于首先使用| ,那么如果我不能使用他们中的任何一个,我使用section-break char§

请注意,您可以使用ALT+number (仅在数字小键盘上)键入任何ASCII字符,所以§ALT+21

\ 0是一个很好的分割字符。 从键盘input非常困难(不可能?),这是合乎逻辑的。

\ n在某些情况下是另一个好的候选人。

当然,.Netstring是unicode,不需要限制第一个255。你可以使用一个罕见的蒙古文字母或一些保留或未使用的Unicode符号。

有重载的String.Split采取string分隔符…

我个人认为完全取决于情况, 如果你正在编写一个简单的TCP / IP聊天系统,你显然不应该使用'\ n'作为分割。但是'\ 0'是一个很好的angular色,因为用户不能用它!

首先,在C#(或.NET)中,可以在一个拆分操作中使用多个拆分字符。

String.Split Method (Char[]) 在这里引用
在此实例中分隔子string的Unicode字符数组,不包含分隔符的空数组或空引用(在Visual Basic中为Nothing)。

在我看来,没有MOST可靠的分割特性,但有些比其他更合适。

stream行的分割字符,如选项卡,逗号,pipe道查看未拆分的string/行是很好的。

如果仅用于存储/处理,则更安全的字符可能是那些很less使用的字符,或者是那些不容易从键盘input的字符。

它也取决于使用情况。 例如,如果您希望数据包含电子邮件地址,“@”是否是否定的。

假设我们从ASCII集中select一个。 有相当多的select。 例如“`”,“^”和一些不可打印的字符。 尽pipe提防某些人物,但并不都适合。 例如,0x00可能会对某些系统产生不利影响。

这很大程度上取决于它所使用的环境。 如果你正在谈论一个非常普遍的划界angular色,那么我不认为有一个万能的答案。

我发现ASCII空字符'\ 0'往往是一个很好的候选人,或者你可以用nitzmahone的想法,并使用多个字符,那么它可以是你想要的疯狂。

或者,您可以parsinginput并转义您的定界字符的任何实例。

“|” 当你传递参数的时候,pipe道符号主要是用来接受一个stringtypes参数的方法。 这在SQL Server SP中也被广泛使用,你需要传递一个数组作为参数。 那么主要取决于你需要的情况。