[cl-json-devel] Bug in encode.lisp
Chris Laux
chris at terraminds.com
Wed Oct 24 09:03:01 UTC 2007
Ok sorry about that, I was too tired for working and should have slept
over that email. You're right of course, the low codes need to be
escaped. I saw other JSON APIs escaping all the "high" unicode chars
(e.g kanji) and thought it was part of the standard.
As I don't develop javascript myself and only offer an API with JSON
output, I don't really know if there's going to be a problem with
unescaped unicode. Probably not.
Thanks,
Chris
Henrik Hjelte wrote:
> Hello,
> thanks for reporting the problem. My ambition with cl-json is that is
> should be completely trustworthy and fully tested. It has unit tests
> that are based on the official testcase data for json and lots of
> other testcases.
>
> However, in your case I am not sure I get the problem and the fix:
>
> On 10/23/07, Chris Laux <chris at terraminds.com> wrote:
>> but kanji don't seem to be encoded
>> properly, using the darcs version. The problem can be resolved by
>> changing the following conditional (see diff below), so I'm guessing
>> that's a bug?
>> < ((> code #x1f)
>> ---
>>> ((<= code #x1f)
>
> Do you want to change write-json-chars to encode every character with
> a code *above* #x1f to a numeric unicode code? If you are having some
> sort of unicode decoding problem I can see that this indeed will fix
> your problem, but it is not a proper solution. That means you are
> having problems with kanji unicode somewhere else in your environment,
> in your Lisp, your webserver or whatever, and encoding each character
> as a numeric unicode number is just a quick fix. (and it is not how
> json is intended to look like, even though it is strictly valid).
> Or did I completely misunderstand it?
>
> Also, can you elaborate on the problem. Is it possible to state the
> problem in a way that I can make a testcase from (expected-input > do
> something > expected output)?
>
> Also, what is your environment. Which lisp, os and so on.
>
> Can your Lisp handle unicode? That is I guess an implicit requirement
> for cl-json, maybe I should make that clearer.
>
> Thanks again, I would really like to help you sort this out.
>
> /Henrik Hjelte
>
> This is how it the code looks now (and should look in my opinion).
> Characters below #x1f are encoded as hex uncode values, character
> above are written as characters (write-char), we trust your lisp
> system uses unicode. Some special characters are written in other
> ways, for example newlines as \n.
>
> (defun write-json-chars (s stream)
> (declare (inline lisp-special-char-to-json))
> (loop for ch across s
> for code = (char-code ch)
> for special = (lisp-special-char-to-json ch)
> do
> (cond
> ((and special (not (char= special #\/)))
> (write-char #\\ stream)
> (write-char special stream))
> ((<= code #x1f)
> (format stream "\\u~4,'0x" code))
> (t (write-char ch stream)))))
>
More information about the cl-json-devel
mailing list