由于编码原因会让你感到恐惧(我不好意思),我需要在一个字符串中存储一些文本项.
我将使用一个角色来划分它们.
哪个角色最适合用于此,即哪个角色最不可能出现在文本中?必须是可打印的,并且在ASCII中可能小于128,以避免区域设置问题.
假设出于一些令人尴尬的原因,你不能使用CSV我会说与数据一起使用.获取一些样本数据,并为每个值0-127执行简单的字符计数.选择其中一个不会发生的.如果选择太多,请获取更大的数据集.写作不会花费太多时间,您将获得最适合您的答案.
对于不同的问题域,答案会有所不同,所以| (管道)在shell脚本中很常见,^在数学公式中很常见,对于大多数其他字符也是如此.
我个人认为我会去| (管道)如果给出了选择但是使用真实数据是最安全的.
无论你做什么,请确保你已经制定了一个逃避计划!
我会选择"单位分隔符"ascii代码"US",ascii 30(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")但许多字体不显示它.
如果你必须显示它,我会建议在解析成字段后在应用程序中显示它.
可能| 或者^或〜你也可以组合两个字符
使用不同语言时,此符号:¬
被证明是最好的.但是我还在测试.
你如何使用CSV样式格式?可以使用标准CSV格式转义字符,并且已经编写了很多解析器.
你说"可打印",但可以包括选项卡(0x09)或换页符(0x0c)等字符.我几乎总是选择制表符而不是逗号用于分隔文件,因为逗号有时会出现在文本中.
(有趣的是该ASCII表具有字符GS(0x1D),RS(0X1E),和美国(0x1F的),用于组,记录和单元分隔符,任何那些是/是).
如果"可打印"是指用户可以识别并轻松输入的字符,我会选择管道 符号首先,与其他一些奇怪的字符(@
或者~
或^
或者\
,或者我在这里似乎无法进入的反引号)作为一种可能性.这些字符+=!$%&*()-'":;<>,.?/
似乎更容易出现在用户输入中.至于下划线_
和哈希#
以及{}[]
我不知道的括号.
你能用管道符号吗?这通常是逗号或制表符分隔字符串后的下一个最常见的分隔符.大多数文本不太可能包含管道,ord('|')为我返回124,所以这似乎符合您的要求.
为了快速转义,我使用这样的东西:说你要结合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","@");
注意:替换的顺序很重要
它坚不可摧,易于实施