So talking only about the encoding/writing phase, the conclusion would be - not to escape $/ - escape everything with code points [0,31], using named escapes if they exist, else \uHHHH - escape $\ itself That leaves the question about $' and $". $' is used in STON as string delimiter, so it has to be escaped. - escape $' Right now, $" is also escaped. Should that remain the case, or only in JSON compatibility mode (where $" is used as string delimiter) ? - do not escape $" In JSON mode, escape $" and not $' then ? When parsing, all named and other escapes are always accepted, as they are now.
On 18 Jan 2017, at 15:25, Peter Uhnak <i.uhnak@gmail.com> wrote:
On Wed, Jan 18, 2017 at 11:11:06AM +0100, Christophe Demarey wrote:
Le 18 janv. 2017 à 09:51, Sven Van Caekenberghe <sven@stfx.eu> a écrit :
Hi Christophe,
STON toString: 'git@github.com:foo/bar.gitâ => ''git@github.com:foo\/bar.gitâ' It used to be ''git@github.com:foo/bar.gitââ.
In other words, it was an implementation error (omission). Note that JSON also has this escape.
Yes and no for JSON.
Only " and \ has to be escaped. Escaping anything else will give it special meaning with the exception of / which will just produce the same thing, because it is a special snowflake. :)
quoted from https://tools.ietf.org/html/rfc7159#section-7:
- Unicode characters may be placed within the quotation marks, except for the characters that must be escaped: quotation mark, reverse solidus, and the control characters (U+0000 through U+001F). - Alternatively, there are two-character sequence escape representations of some popular characters.
"/" (U+002F) doesn't fall into control character range, but the alternative section does permit it escaping it.
In other words, JSON strings "\/", and "/", and "\u002f" are equivalent.
But JSON itself doesn't require you to escape "/" (just like you are not required to escape "hi" into "\u0068\u0069", although you can).
Note that other systems do not escape / by default:
(Pharo) NeoJSONWriter toString: 'git@github.com:foo/bar.git' => "git@github.com:foo/bar.git"
(JavaScript) JSON.stringify('git@github.com:foo/bar.git') => "git@github.com:foo/bar.git"
(Ruby) require 'json' puts 'git@github.com:foo/bar.git'.to_json => "git@github.com:foo/bar.git"
Peter