代码之家  ›  专栏  ›  技术社区  ›  Too embarrassed to say

普通文本中使用最少的分隔符<ASCII 128

  •  105
  • Too embarrassed to say  · 技术社区  · 16 年前

    出于会让你感到害怕的编码原因(我不好意思说),我需要在一个字符串中存储多个文本项。

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

    哪个字符最适合用于此,即哪个字符最不可能出现在文本中?必须可打印,ASCII格式可能小于128,以避免区域设置问题。

    17 回复  |  直到 5 年前
        1
  •  65
  •   sadolit Edwin Buck    6 年前

    我会选择“单位分隔符”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”),但许多字体不显示它。

    若必须显示它,我建议在将其解析为字段后,在应用程序中显示它。

        2
  •  39
  •   Nick Fortescue    16 年前

    假设由于某种令人尴尬的原因,你不能使用CSV,我会说使用数据。取一些样本数据,对每个值0-127进行简单的字符计数。选择一个没有发生的。如果有太多的选择,那就选择一个更大的数据集。写起来不会花太多时间,你会得到最适合你的答案。

    对于不同的问题域,答案会有所不同,因此|(管道)在shell脚本中很常见,^在数学公式中也很常见,对于大多数其他字符来说可能也是如此。

    我个人认为,如果可以选择,我会选择|(管道),但使用真实数据是最安全的。

    无论你做什么,都要确保你制定了一个逃跑计划!

        3
  •  25
  •   Icarin    14 年前

    使用不同语言时,此符号:

    事实证明是最好的。但我仍在测试。

        4
  •  22
  •   SQLMenace    16 年前

    也许|、^或~你也可以组合两个字符

        5
  •  17
  •   Jason S    16 年前

    你说的是“可打印”,但这可能包括制表符(0x09)或换行符(0x0c)等字符。我几乎总是选择制表符而不是逗号来分隔文件,因为逗号有时会出现在文本中。

    (有趣的是 ascii table 具有用于组、记录和单位分隔符的字符GS(0x1D)、RS(0x1E)和US(0x1F),无论这些分隔符是什么。)

    如果“可打印”是指用户可以识别并轻松键入的字符,我会先选择管道|符号,再加上其他一些奇怪的字符( @ ~ ^ \ ,或者我似乎无法在这里输入的回溯)作为一种可能性。这些角色 +=!$%&*()-'":;<>,.?/ 看起来它们更有可能出现在用户输入中。至于下划线 _ 哈希 # 以及括号 {}[] 我不知道。

        6
  •  16
  •   GEOCHET S.Lott    16 年前

    你使用CSV风格的格式怎么样?字符可以以标准CSV格式转义,并且已经编写了很多解析器。

        7
  •  9
  •   Jay    16 年前

    你能用烟斗符号吗?这通常是逗号或制表符分隔字符串之后的第二个最常见的分隔符。大多数文本不太可能包含管道,ord(“|”)为我返回124,因此这似乎符合您的要求。

        8
  •  9
  •   Mohammad Amin    14 年前

    为了快速逃离,我使用了这样的东西: 假设你想连接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","@");
    

    注意:替换顺序很重要

    它牢不可破,易于实施

        9
  •  3
  •   Eppz    16 年前

    为胜利干杯! |

        10
  •  3
  •   Joe    16 年前

    我们使用ascii 0x7f,它是伪可打印的,在常规使用中很少出现。

        11
  •  2
  •   Jackson    16 年前

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

        12
  •  1
  •   Matthew Lynam Matthew Lynam    16 年前

    我想我从来没有在自然文本中看到过与号后跟逗号,但你可以先检查文件,看看它是否包含分隔符,如果是这样,请使用其他分隔符。如果你想始终知道你使用的分隔符不会导致冲突,那么做一个循环,检查文件中是否有你想要的分隔符,如果存在,则将字符串加倍,直到文件不再匹配。是否有类似的字符串并不重要,因为您的程序只会查找精确的分隔符匹配。

        13
  •  1
  •   Coxy    16 年前

    这可能是好的或坏的(通常是坏的),具体取决于情况和语言,但请记住,您始终可以对整个内容进行Base64编码。然后,您不必担心在每一侧转义和取消转义各种模式,您可以根据Base64字符集中未使用的字符简单地分离和拆分字符串。

    当面临将XML文档放入XML属性/节点时,我不得不求助于这种解决方案。属性中根本不能有CDATA块,作为CDATA转义的节点显然不能在不破坏结构的情况下在其中有更多的CDATA块。

    不过,对于大多数情况来说,CSV可能是一个更好的主意。

        14
  •  1
  •   Will Johnson    12 年前

    pipe和caret都是显而易见的选择。我要注意的是,如果用户需要键入整个响应,那么在任何键盘上都比在管道上更容易找到插入符号。

        15
  •  0
  •   Albert Podzunas    4 年前

    我以前用过双管和双管。如果您不手动创建或修改文件,则不可打印字符的想法是可行的。为了快速随机访问文件,使用了字段宽度。你甚至不必阅读文件。你实际上是通过引用从文件中提取的。数据库就是这样进行存储的。但它们也管理记录之间的空间等。并介绍了最大数据元素宽度的问题。(索引附加一个标头,用于定义每个元素的宽度及其在旧时代的数据类型。后来,他们引入了使用重映射字符的压缩。这允许文本文件在传输时获得大约1/8的大小。可变长度字符编码用于获胜

        16
  •  0
  •   milahu    4 年前

    让它充满活力:)

    在文件头中宣布您的控制字符

    例如

    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

        17
  •  0
  •   bryc    2 年前

    我有时需要解析一组充当分隔信息的文件名。或者我在记事本上打一个列表,希望它是可解析的。除非你引用了所有的值,否则逗号不是一个好的选择。

    如果可能的话,我也喜欢用键盘打字。Windows不能安装管道( | ),因此,如果需要文件名兼容性,管道就会关闭。此外,如果它是“网络安全的”,那将是理想的。这排除了 @ , = # 它有一些潜力(尽管在文本中确实显示为@name和#tag),以及 $ ,这也有一定的可行性。分号似乎是一个不错的选择,但太常见了(笑脸,人们在文件名中使用它而不是冒号)。 % 有潜力,但用于URL编码字符,如 %20 等等

    重音符 可能是最好的选择。我几乎从未见过它,当我看到它时,它被用作撇号,可以提前替换。但它也是Markdown中的一个重要字符,所以用回溯分隔的列表不会很好。我也喜欢不用按住shift键就能打字(至少在美国键盘上)。

    波浪号 是一个值得尊敬的第二选择。它也几乎从未被使用过,但在某些类型的“互联网语言”中确实有使用,所以如果你要将正文与潜在用户数据区分开来,你可能想以某种方式避开它。

    光标 也值得考虑,尽管它有时也可以用于“网络语言”,特别是在亚洲国家,即。 ^_^ .

    感叹号 肯定会出现在语法文本中,但值得一提。

    如果可以使用两个字符分隔符(或三个),则会有更多的可能性。

    使用括号变得可行。例如 ][ , }{ , )( 。或者,您可以复制上述内容,或混合搭配,例如 ~^ ^~ .

    使用三个字符分隔符,我喜欢两个空格之间有一个字符。例如, Artist - Song title 可以使用以下方式可靠地拆分 - 。但使用其他字符,如回溯符也可以。唯一需要担心的可能是拼写错误,例如 A ` B `C ` D .

    所以,是的,有很多可行的选择,但没有一个是真正的“标准”的,除非你在标头中明确地存储分隔符。

    推荐文章