分隔字符串的最佳ASCII字符是什么
What is the best ASCII char to separate a string?
我在一个系统上工作,客户可以在该系统上向我发送编码为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而不是内部格式。
理由:
- 它看起来已经像JSON了
- 分隔符没有问题。它迟早会出错,例如参见unix/posix系统上的
$IFS
-hell - 易于人类阅读,而不是使用可能无法正确显示且人类无法轻松输入的特殊字符(主要用于调试目的)
- 可忽略的开销(如果有的话)
- 在几乎所有现存的语言中解析和生成JSON都不费吹灰之力
- C/C++的JSON库有很多变体,并且有很多许可证,所以即使对于专有软件来说,包含其中一个也不是问题
\x0D或\x0A是一个简单的选择,如果您没有多行输入字符串,并且这些字符串可以很容易地显示。如果用户无法输入,则使用制表符(\x09)。
我不知道它是否是最好的—我不知道是否有"最佳"—但我看到"|
"在这方面使用了很多。
如果它不必是可见的,也不必是通过键盘输入的,有许多控制字符可以做到这一点:ASCII单独定义了四个:FS、GS、RS和US(用于字段分隔符、组分隔符、记录分隔符和单元分离器),代码0x1C-0x1F;这些都是自然的。
当然,最普遍的解决方案是引用字符串,带有转义符。这两者都更难解析和生成。