出于编码方面的原因,这会使您感到恐惧(我不好意思地说),我需要将多个文本项存储在单个字符串中。
我将使用字符来分隔它们。
哪个字符最适合用于此目的,即哪个字符最不可能出现在文本中?必须可打印,并且以ASCII表示可能小于128,以避免区域设置问题。
出于编码方面的原因,这会使您感到恐惧(我不好意思地说),我需要将多个文本项存储在单个字符串中。
我将使用字符来分隔它们。
哪个字符最适合用于此目的,即哪个字符最不可能出现在文本中?必须可打印,并且以ASCII表示可能小于128,以避免区域设置问题。
|
在文本中带有的人,我实际上遇到了这样一种情况,我需要将字符尽可能地减少到最小。由于大多数字段中包含带有有趣文本的字符串,因此由于大量转义,CSV无法正常工作。我们的字段定界符为/|
。斜线仅在中等水平出现,但与从未遇到过的管道配对。我一直在使用引擎,每天都会通过它传递大量数据。这从未中断过,我也不需要封装单个字符串或转义特殊字符。平均而言,该机制为我们节省了一些百分比的文本。
Answers:
假设出于某些令人尴尬的原因,您不能使用CSV,我想说一下数据。取一些样本数据,并对每个值0-127进行简单的字符计数。选择一种不会发生的情况。如果选择过多,请获取更大的数据集。不需要花费很多时间来编写,而且您会得到最适合自己的答案。
对于不同的问题域,答案将有所不同,因此| (pipe)在shell脚本中很常见,^在数学公式中很常见,大多数其他字符也可能如此。
我个人认为我会去| (管道)(如果可以选择),但处理真实数据最安全。
无论您做什么,请确保已制定出逃避方案!
additional_attributes
。
\t
中的所有制表符,然后使用制表符作为分隔符?
我会选择“单位分隔符” ASCII代码“ US”:ASCII 31(0x1F)
在过去,过去,大多数事情都是连续进行的,没有随机访问权限。这意味着一些控制代码已嵌入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显示(通常在同一字形中为“ us”),但许多字体均不显示。
如果必须显示它,我建议在将其解析为字段之后在应用程序中显示它。
当使用其他语言时,此符号:¬
被证明是最好的。但是我仍在测试。
您说的是“可打印的”,但是可以包含诸如制表符(0x09)或换页(0x0c)之类的字符。对于分隔文件,我几乎总是选择制表符而不是逗号,因为逗号有时可以出现在文本中。
(有趣的是,ascii表具有用于组,记录和单位分隔符的字符GS(0x1D),RS(0x1E)和US(0x1F),无论它们是什么。
如果“可打印的”是指用户可以识别并轻松键入的字符,那么我将尽力而为。首先是符号,还有其他一些奇怪的字符(@
或者,~
或者,^
或者\
,或者反引号,我似乎无法在此处输入)。这些字符+=!$%&*()-'":;<>,.?/
似乎更可能出现在用户输入中。至于下划线_
和哈希#
以及括号,{}[]
我不知道。
28 FS
文件分隔符,29 GS
组分隔符,30 RS
记录分隔符,31 US
单位分隔符。不幸的是,几乎没有人使用它们,尽管这正是它们的初衷。我个人讨厌CSV格式的文件,因为太多的人没有考虑透彻,并且弄乱了我们的程序员必须支持的格式,如果我们想支持他们的文件格式。
您如何使用CSV样式格式?可以使用标准CSV格式对字符进行转义,并且已经编写了很多解析器。
为了快速转义,我使用如下代码:假设您要合并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","@");
注意:更换顺序很重要
它坚不可摧且易于实施
取决于情况和语言,这可能是好是坏(通常是不好),但是请记住,您始终可以对Base64进行整体编码。这样,您就不必担心转义和取消转义各种模式,并且可以简单地根据Base64字符集中未使用的字符来分离和分割字符串。
面对将XML文档放入XML属性/节点时,我不得不诉诸此解决方案。属性根本不能在其中包含CDATA块,并且转义的节点因为CDATA显然不能在其中进一步破坏CDATA块而不破坏结构。
不过,对于大多数情况,CSV可能是一个更好的主意。
我认为我从未见过&符号,后接自然文本逗号,但是您可以首先检查文件以查看其是否包含定界符,如果是,请使用替代方法。如果您始终希望知道使用的定界符不会引起冲突,请循环检查文件中所需的定界符,如果存在,则将字符串加倍,直到文件不再匹配为止。是否存在相似的字符串并不重要,因为您的程序只会查找精确的定界符匹配项。