【问题标题】:Using non-printable characters as a delimiter in PHP?在 PHP 中使用不可打印字符作为分隔符?
【发布时间】:2011-11-21 01:37:34
【问题描述】:

在文件中存储数组时,我使用分隔符将其内爆,但如果任何值中包含分隔符,那么这将破坏该值(并给我 2 个较小的值)。

使用不可打印字符作为分隔符是一种好习惯吗?如果是这样,该怎么做?

【问题讨论】:

  • 这实际上取决于您的用例。数据是什么,您希望如何读取它,您是否预计特定上下文会使用不可打印的分隔符?

标签: php delimiter


【解决方案1】:

这曾经是 80 年代的一种做法。特别是 ASCII 字符集有一些不可打印的符号就是为了这个目的。

   034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
   035   29    1D    GS  (group separator)       135   93    5D    ]
   036   30    1E    RS  (record separator)      136   94    5E    ^
   037   31    1F    US  (unit separator)        137   95    5F    _

您可以在 PHP 中像 "\036" 一样使用它们,然后由它们拆分。但是 JSON 或 phps serialize() 格式甚至 XML 比二进制格式更适合 webapps。

【讨论】:

  • +1 我对这些角色从来都不陌生,感谢您提供的信息。我猜最好使用 RS (chr(30)),而不是我的答案中的 tab。
  • @vascowhite,您可能会意识到这一点,但是无论您使用什么字符,您仍然容易受到包含它的故意制作的用户输入的影响。
  • @MatthewFlaschen 仅当数据来自用户时。并非所有数据都如此。
【解决方案2】:

要将任何数据结构存储在文件中,您应该使用serialize 来存储并使用unserialize 再次恢复数据结构。

【讨论】:

    【解决方案3】:

    为此,有许多序列化格式都有规范,说明如何处理序列化格式中具有特殊含义的字符。使用其中之一,例如JSON、serialized PHP 或CSV。

    【讨论】:

    • 是的,但在我的基准测试中,explode/implode 比序列化快 3 倍,而且速度是个问题。
    【解决方案4】:

    我认为这不是最佳做法,但如果您出于某种原因必须这样做,那么下面的示例显示了一种使用制表符作为分隔符的方法。这张表可能对你有用http://www.asciitable.com/。

    $testArray = array('item1', 'item2', 'item3');
    $delimiter = chr(9);
    $imploded = implode($delimiter, $testArray);
    var_dump($imploded);
    var_dump(explode($delimiter, $imploded));
    

    在@mario 的回答中使用$delimiter = chr(30) 可能会更好。

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多