正常文本中最less使用分隔符<ASCII 128

由于编码的原因,会吓坏你(我不好意思说),我需要在一个string中存储一些文本项目。

我将使用一个字符来分隔它们。

哪个字符最适合用于这种情况,即哪个字符最不可能出现在文本中? 必须是可打印的,并且可能less于128个ASCII码以避免出现语言环境问题。

假设一些尴尬的原因,你不能使用CSV我会说数据。 取一些示例数据,并为每个值0-127做一个简单的字符计数。 select其中一个不发生的。 如果有太多select获得更大的数据集。 写作不需要太多时间,你会得到最适合你的答案。

对于不同的问题领域,答案会有所不同 (pipe道)在shell脚本中很常见,^在math公式中很常见,大多数其他字符也是如此。

我个人认为我会去| (pipe道)如果给出一个select,但与真实的数据是最安全的。

无论你做什么,确保你已经制定了一个逃避计划!

可能是| 或^或〜你也可以结合两个字符

你如何使用CSV风格的格式? 字符可以以标准的CSV格式转义,并且已经有很多已经写好的parsing器。

你说“可打印”,但可以包括字符,如制表符(0x09)或换页(0x0c)。 我几乎总是select制表符而不是逗号作为分隔文件,因为逗号有时会出现在文本中。

(有趣的是, ascii表中有字符GS(0x1D),RS(0x1E)和US(0x1F)用于组,logging和单元分隔符,不pipe这些是什么。

如果“可打印”是指用户可以识别并容易input的字符,那么我会去pipe道 符号第一,与其他一些奇怪的字符( @~^\ ,或反向,我似乎无法进入这里)作为一种可能性。 这些字符+=!$%&*()-'":;<>,.?/看起来像是在用户input中可能发生的那样。不知道。

你可以使用pipe道符号吗? 这通常是以逗号或制表符分隔的string之后的最常用的分隔符。 大多数文本不可能包含pipe道,ord('|')对我来说会返回124,所以这似乎符合您的要求。

当使用不同的语言时,这个符号:¬

被certificate是最好的。 不过我还在testing。

为了快速逃脱,我使用这样的东西:说你想concocate str1,str2和str3我所做的是:

 delimitedStr=str1.Replace("@","@a").Replace("|","@p")+"|"+str2.Replace("@","@a").Replace("|","@p")+"|"+str3.Replace("@","@a").Replace("|","@p"); 

然后检索原始使用:

 splitStr=delimitedStr.Split("|".ToCharArray()); str1=splitStr[0].Replace("@p","|").Replace("@a","@"); str2=splitStr[1].Replace("@p","|").Replace("@a","@"); str3=splitStr[2].Replace("@p","|").Replace("@a","@"); 

注意:replace的顺序很重要

它坚不可摧,易于实施

我会select“单位分隔符”ascii代码“US”,ascii 30(0x1F)

在过去,过去,大部分事情是连续进行的,没有随机访问。 这意味着一些控制代码被embedded到ASCII中。

 ASCII 28 (0x1C) File Separator - Used to indicate separation between files on a data input stream. ASCII 29 (0x1D) Group Separator - Used to indicate separation between tables on a data input stream (called groups back then). ASCII 30 (0x1E) Record Separator - Used to indicate separation between records within a table (within a group). These roughly map to a tuple in modern nomenclature. ASCII 31 (0x1F) Unit Separator - Used to indicate separation between units within a record. The roughly map to fields in modern nomenclature. 

单元分隔符是ASCII码,并且有显示它的Unicode支持(通常是同一字形中的“我们”),但许多字体不显示它。

如果你必须显示它,我build议在它被parsing成字段之后,在应用程序中显示它。

赢得胜利! |

我们使用ascii 0x7f这是伪打印,几乎没有经常使用。

这可能是好的或坏的(通常是坏的)取决于情况和语言,但请记住,你总是可以Base64编码整个事情。 然后,您不必担心每一边的各种模式都可以逃脱和消除,您可以简单地根据Base64字符集中不使用的字符分隔和分割string。

当面对将XML文档放入XML属性/节点时,我不得不求助于这个解决scheme。 属性根本就不能有CDATA块,而且节点转义了,因为CDATA显然不能在内部有更多的CDATA块而不会破坏结构。

不过,在大多数情况下,CSV可能是一个更好的主意。

那么它会在一定程度上取决于文本的性质,但是垂直条0x7C不会经常出现在文本中。

我不认为我曾经看到过自然文本后面跟着一个逗号,但是可以先检查文件是否包含分隔符,如果是,请使用替代方法。 如果您想要始终能够知道您使用的分隔符不会导致冲突,请循环检查文件以获取所需的分隔符,如果存在,则将string加倍,直到文件不再有匹配。 不要紧,如果有相似的string,因为你的程序只会查找确切的分隔符匹配。

你可能不得不select一些东西而忽略其他用途。

 + 

可能是一个很好的候选人。

pipe子和脱字符号都是明显的select。 我会注意到,如果用户需要键入整个响应,则在任何键盘上插入的字符都比在pipe道上更容易。

我不确定是否需要使用ASCII,但是如果你能用UTF-8编码,你可以find一个非常晦涩的符号,如: (U + 2561) – 我用了很多我的节目。

您还可以查看对象序列化,并为您可能需要的所有元素创build新的字段。