由于编码原因(我感到非常尴尬,不敢说出来),我需要将多个文本项目存储在单个字符串中。
我将使用一个字符来分隔它们。
哪个字符最适合用于此,即哪个字符最不可能出现在文本中?必须是可打印的,并且可能小于128的ASCII以避免区域设置问题。
我会选择ASCII码的“单元分隔符”——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"),但许多字体无法正确显示它。
如果您必须显示它,建议将其解析为字段后在应用程序中进行显示。
0x1C-0x1F
,对吧? - Eric Duminil0x1c-0x1F
将被排除在外(以及许多其他项目)。 没有某种形式的数据净化,即使我怀疑他们通常不会这样做,有创意的用户也可能混入那些字符。 它将是SQL注入攻击的文本等效物。 请注意,您的4个数据维度并不意味着维度是均匀的。 可以有一个记录比之前的记录具有更多的单位,或者更少的单位。 - Edwin Buck\t
作为分隔符呢? - Elie G.在使用不同语言时,这个符号:¬
被证明是最好的。不过我还在测试中。
not sign
的 charcode 172 不是 ASCII,而是 CP-1252。 - milahu可能是 | 或 ^ 或 ~ ,您也可以组合两个字符
@
或 ~
或 ^
或 \
或反引号,我似乎无法在这里输入)。这些字符+=! $%&*() -'“:;<>,.? /
看起来更可能出现在用户输入中。至于下划线_
和井号#
以及括号{}[]
,我不知道。28 FS
文件分隔符,29 GS
组分隔符,30 RS
记录分隔符,31 US
单元分隔符。不幸的是,几乎没有人使用它们,尽管这正是它们的初衷。我个人讨厌CSV格式文件,因为很多人不考虑周全,弄得我们程序员必须处理他们的文件格式混乱。 - deegee你考虑使用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","@");
你能使用管道符号吗?在逗号或制表符分隔的字符串之后,这通常是下一个最常用的分隔符。大多数文本不太可能包含管道符号,ord('|')对我返回124,因此它似乎符合您的要求。
我们使用 ASCII 0x7f,这是一种伪可打印字符,在正常使用中几乎不会出现。
|
的人,我实际上遇到过这样的情况,我需要尽可能地减少字符数量。由于大多数字段都是带有有趣文本的字符串,CSV 由于转义过多而无法使用。我们的字段分隔符是/|
。斜杠只是适度常见,但与管道配对使用时永远不会遇到它。我一直在使用一个引擎,每天都会传递大量数据。这从未出现过问题,我从未需要封装单个字符串或转义特殊字符。平均而言,这种机制为我们节省了一些文本百分比。 - RLH