String 字符来分隔值
我需要创建一个字符串来存储成对的键/值数据,例如:String 字符来分隔值,string,serialization,String,Serialization,我需要创建一个字符串来存储成对的键/值数据,例如: key1::value1||key2::value2||key3::value3 { "a:b:c": "foo||bar", "asdf": "\\|||x||||:" } serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:" 在对其进行反序列化时,如果键或值恰好包含|或: 处理这种情况的常用技巧是什么?谢谢处理此问题的常用方法称为转义字符或限定符。考虑这个逗号分
key1::value1||key2::value2||key3::value3
{ "a:b:c": "foo||bar", "asdf": "\\|||x||||:" }
serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:"
在对其进行反序列化时,如果键或值恰好包含|
或:
处理这种情况的常用技巧是什么?谢谢处理此问题的常用方法称为转义字符或限定符。考虑这个逗号分隔线:
Name,City,State
John Doe, Jr.,Anytown,CA
因为name字段包含逗号,所以它当然会被不正确地拆分,以此类推
如果用限定符括住每个数据值,则解析器知道何时忽略分隔符,如本例所示:
Name,City,State
"John Doe, Jr.",Anytown,CA
限定符可以是可选的,仅用于需要它的数据字段。许多实现将在每个字段上使用限定符,不管是否需要
您可能希望为数据编码实现类似的功能。处理此问题的常用方法称为转义字符或限定符。考虑这个逗号分隔线:
Name,City,State
John Doe, Jr.,Anytown,CA
因为name字段包含逗号,所以它当然会被不正确地拆分,以此类推
如果用限定符括住每个数据值,则解析器知道何时忽略分隔符,如本例所示:
Name,City,State
"John Doe, Jr.",Anytown,CA
限定符可以是可选的,仅用于需要它的数据字段。许多实现将在每个字段上使用限定符,不管是否需要
您可能希望为数据编码实现类似的功能。常用的技术是转义保留字符,例如:
key1::value1||key2::value2||key3::value3
{ "a:b:c": "foo||bar", "asdf": "\\|||x||||:" }
serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:"
- 在URL中,可以转义一些字符 使用%HEX表示法:
- 在编程语言中,您可以逃避 某些带有斜杠前缀的字符: “\“你好”
- 常见的技术是转义保留字符,例如:
key1::value1||key2::value2||key3::value3
{ "a:b:c": "foo||bar", "asdf": "\\|||x||||:" }
serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:"
- 在URL中,可以转义一些字符 使用%HEX表示法:
- 在编程语言中,您可以逃避 某些带有斜杠前缀的字符: “\“你好”
当然,当分隔符出现在数据中时也需要转义;在这种情况下,反斜杠将变为
\\
一个简单的解决方案是在数据中出现任何分隔符时(例如,使用反斜杠)将其转义:
Name,City,State
John Doe\, Jr.,Anytown,CA
姓名、城市、州
小约翰·多伊,加利福尼亚州安尼镇
当然,当分隔符出现在数据中时也需要转义;在这种情况下,反斜杠将变为\
使用前缀(如“a”)作为键中的特殊字符(如“b”)和值来存储它们。这称为转义
然后通过简单地将任何“ab”序列替换为“b”来解码键和值请记住前缀也是一个特殊字符。例如:
前缀:\
特殊字符::
,
,\
编码:
title:Slashdot\:书呆子新闻。重要的东西。|短标题:\\.
解码:
title
=Slashdot:书呆子新闻。重要的东西。
shortTitle
=\.
使用前缀(如“a”)作为键中的特殊字符(如“b”)和值来存储它们。这称为转义
然后通过简单地将任何“ab”序列替换为“b”来解码键和值请记住前缀也是一个特殊字符。例如:
前缀:\
特殊字符::
,
,\
编码:
title:Slashdot\:书呆子新闻。重要的东西。|短标题:\\.
解码:
title
=Slashdot:书呆子新闻。重要的东西。
shortTitle
=\.
序列化时转义|
,反序列化时取消转义。一种常见的类似C的转义方法是预先加上\
。例如:
key1::value1||key2::value2||key3::value3
{ "a:b:c": "foo||bar", "asdf": "\\|||x||||:" }
serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:"
请注意,
\
需要转义(由于被放在C样式的字符串中,所以需要双转义)。序列化时转义|
,反序列化时取消转义。一种常见的类似C的转义方法是预先加上\
。例如:
key1::value1||key2::value2||key3::value3
{ "a:b:c": "foo||bar", "asdf": "\\|||x||||:" }
serialize => "a\:b\:c:foo\|\|bar||asdf:\\\\\|\|\|x\|\|\|\|\:"
请注意,
\
需要转义(并且由于被放在C样式字符串中而需要双转义)。如果我们假设您完全控制输入字符串,那么处理此问题的常用方法是使用转义字符
通常,反斜杠-\字符用作转义,表示“下一个字符是特殊字符”,因此在这种情况下,不应将其用作分隔符。因此,解析器会将\\\\\\\\\\\\
和:
视为分隔符,但会将\\\\\\\\\
视为键或值中的两个管道字符
下一个问题是我们重载了反斜杠。问题是,“如何表示反斜杠”。这可以通过说反斜杠也被转义来解决,因此要表示\
,必须说\
。因此解析器将\\
视为\
请注意,如果使用转义字符,则可以使用单个字符作为分隔符,这可能会使事情变得更简单
或者,您可能必须重新输入,并说字符串编码时,
|
和:
只是被禁用和失败/删除。如果我们假设您完全控制输入字符串,那么处理此问题的常用方法是使用转义字符
通常,反斜杠-\字符用作转义,表示“下一个字符是特殊字符”,因此在这种情况下,不应将其用作分隔符。因此,解析器将\\\\\\\
和:
视为分隔符,但将\\\\\\\\/code>视为