分隔字符串的最佳ASCII字符是什么



我在一个系统上工作,客户可以在该系统上向我发送编码为utf-8的unicode字符串。在某个时刻,我使用一种逗号分隔的列表来打包/序列化(C++),比如:

fieldName:value,other fieldname:value, etc....

该字符串从一个进程中取出,并被python脚本捕获以提取字典:

 {"fieldName":"value", etc..... }

为了提取它,我使用了一个简单的正则表达式re.compile(ur"(.*?):(.*?)(?:,|$)", re.UNICODE)。但我知道用户可以在他们发送的字符串中使用,:,所以我正在搜索我在C++级别可以使用的最好的ASCII代码来代替我现在使用的逗号?

如果xF8(248)必须是用户无法用键盘输入的内容,那么它是一个好选择吗!任何帮助&欢迎提出建议。

我会使用其中一个ASCII字段分隔符控制代码;这些具有标准化含义的优点:

^  28  1C  FS  ␜   File Separator
^]  29  1D  GS  ␝   Group separator 
^^  30  1E  RS  ␞   Record Separator    
^_  31  1F  US  ␟   Unit separator  

可以用作分隔符来标记数据结构的字段。如果用于分层级别,US是最低级别(划分纯文本数据项),而RS、GS和FS是递增级别,以划分由其下级别的项组成的组。

或者使用真正的格式,如JSON或XML。

使用JSON而不是内部格式。

理由:

  1. 它看起来已经像JSON了
  2. 分隔符没有问题。它迟早会出错,例如参见unix/posix系统上的$IFS-hell
  3. 易于人类阅读,而不是使用可能无法正确显示且人类无法轻松输入的特殊字符(主要用于调试目的)
  4. 可忽略的开销(如果有的话)
  5. 在几乎所有现存的语言中解析和生成JSON都不费吹灰之力
  6. C/C++的JSON库有很多变体,并且有很多许可证,所以即使对于专有软件来说,包含其中一个也不是问题

\x0D或\x0A是一个简单的选择,如果您没有多行输入字符串,并且这些字符串可以很容易地显示。如果用户无法输入,则使用制表符(\x09)。

我不知道它是否是最好的—我不知道是否有"最佳"—但我看到"|"在这方面使用了很多。

如果它不必是可见的,也不必是通过键盘输入的,有许多控制字符可以做到这一点:ASCII单独定义了四个:FS、GS、RS和US(用于字段分隔符、组分隔符、记录分隔符和单元分离器),代码0x1C-0x1F;这些都是自然的。

当然,最普遍的解决方案是引用字符串,带有转义符。这两者都更难解析和生成。

最新更新