由于编码原因会让你感到恐惧(我太尴尬了),我需要在一个字符串中存储一些文本项。
我将使用角色划分它们。
最适合使用哪个字符,即哪个字符最不可能出现在文本中?必须是可打印的,并且在ASCII中可能小于128,以避免区域设置问题。
答案 0 :(得分:29)
假设出于一些令人尴尬的原因,你不能使用CSV我会说使用数据。获取一些样本数据,并为每个值0-127执行简单的字符计数。选择其中一个不会发生的。如果选择太多,请获取更大的数据集。写作不会花费太多时间,你会得到最适合你的答案。
对于不同的问题域,答案会有所不同,所以| (管道)在shell脚本中很常见,^在数学公式中很常见,对于大多数其他字符也是如此。
我个人认为我会选择| (管道)如果给出了选择但是使用真实数据是最安全的。
无论你做什么,请确保你已经制定了逃避计划!
答案 1 :(得分:17)
可能|或者^或〜你也可以组合两个字符
答案 2 :(得分:14)
我会选择“单位分隔符”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”),但许多字体不显示它。
如果你必须显示它,我会建议在解析成字段之后在应用程序中显示它。
答案 3 :(得分:14)
使用不同语言时,此符号为:¬
被证明是最好的。但是我还在测试。
答案 4 :(得分:13)
您使用CSV样式格式怎么样?字符可以使用标准CSV格式进行转义,并且已经有很多解析器已经写好了。
答案 5 :(得分:12)
您说“可打印”,但可以包含制表符(0x09)或换页符(0x0c)等字符。我几乎总是选择制表符而不是逗号分隔文件,因为逗号有时可以用文字显示。
(有趣的是,ascii table对于组,记录和单位分隔符都有字符GS(0x1D),RS(0x1E)和US(0x1F),无论它们是什么。)
如果“可打印”是指用户可以识别并轻松输入的字符,我会选择管道。首先是符号,其他一些奇怪的字符(@
或~
或^
或\
,或者我不能在这里输入的反引号)作为一种可能性。这些字符+=!$%&*()-'":;<>,.?/
似乎更有可能出现在用户输入中。至于下划线_
和哈希#
以及括号{}[]
,我不知道。
答案 6 :(得分:9)
你能用管道符号吗?这通常是逗号或制表符分隔字符串后的下一个最常见的分隔符。大多数文本不太可能包含管道,ord('|')为我返回124,所以这似乎符合您的要求。
答案 7 :(得分:7)
为了快速转义,我使用这样的东西: 说你想要连接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","@");
注意:替换的顺序很重要
它坚不可摧,易于实施
答案 8 :(得分:2)
赢得胜利! |
答案 9 :(得分:2)
我们使用ascii 0x7f,它是伪可打印的,在常规使用中几乎不会出现。
答案 10 :(得分:2)
根据情况和语言,这可能是好的也可能是坏的(通常很糟糕),但请记住,您可以随时对Base64进行编码。然后,您不必担心转义和转移各方面的各种模式,您可以根据Base64字符集中未使用的字符简单地分隔和拆分字符串。
在面对将XML文档放入XML属性/节点时,我不得不求助于此解决方案。属性根本不能包含CDATA块,并且节点被转义,因为CDATA显然不能在不破坏结构的情况下在其中包含更多CDATA块。
但对于大多数情况来说,CSV可能是更好的主意。
答案 11 :(得分:1)
我不认为我曾经在自然文本中看到过&符号后跟逗号,但您可以先查看该文件以查看它是否包含分隔符,如果是,请使用替代方法。如果您希望始终能够知道您使用的分隔符不会导致冲突,那么请循环检查文件以查找所需的分隔符,如果它存在,则将该字符串加倍,直到该文件不再匹配为止。如果有相似的字符串则无关紧要,因为您的程序只会查找精确的分隔符匹配。
答案 12 :(得分:1)
我不确定你是否需要使用ASCII,但如果你能用UTF-8编码它,你可以找到一个非常模糊的符号,如:╡
(U+2561) - 我使用的是在我的程序中很多。
您还可以查看对象序列化,只需为您可能需要的所有元素创建新字段。
答案 13 :(得分:1)
管道和插入符号都是明显的选择。我会注意到,如果希望用户输入整个响应,则在管道上比使用管道更容易找到插入符号。
答案 14 :(得分:1)
嗯,它会在某种程度上取决于文本的性质,但垂直条0x7C不会经常出现在文本中。
答案 15 :(得分:1)
你可能不得不选择一些东西并忽略它的其他用途。
+
可能是一个很好的候选人。
答案 16 :(得分:0)
我以前使用过双管道和双插入符号。如果您不手动创建或修改文件,则不可打印字符的想法有效。为了快速随机访问文件存储和检索字段宽度被使用。您甚至不必阅读文件.. 您实际上是通过引用从文件中提取的。这就是数据库如何进行一些存储......但它们也管理记录之间的空间等等。并且它引入了最大数据元素宽度的问题。 (索引附加一个标题,用于定义每个元素的宽度及其原始过去的数据类型......后来他们引入了重新映射字符的压缩。这允许文本文件在传输中获得大约 1/8 的大小.. win 的可变长度字符编码
答案 17 :(得分:0)
让它变得动态:)
在文件头中声明你的控制字符
例如
delimiter: ~
escape: \
wrapline: $
width: 19
hello world~this i$
s \\just\\ a sampl$
e text~$someVar$~h$
ere is some \~\~ma$
rkdown strikethrou$
gh\~\~ text
会给字符串
hello world
this is \just\ a sample text
$someVar$
here is some ~~markdown strikethrough~~ text
我已经实现了类似的东西:
plaintar
文本容器格式,
以 ascii 转义和包装 utf16 文本,
作为 mime 多部分消息的替代方案。
见https://github.com/milahu/live-diff-html-editor