json.writer: support escaping unicode > 0x10000. Thanks @jonenst!
parent
ee8be0a8dd
commit
1ec43d7913
|
@ -68,3 +68,6 @@ TUPLE: person first-name age ;
|
|||
"\0\x01\x02\x03\x04\x05\x06\a\b\t\n\v\f\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\e\x1c\x1d\x1e\x1f"
|
||||
>json
|
||||
] unit-test
|
||||
|
||||
{ "\"\\ud834\\udd1e\"" }
|
||||
[ t json-escape-unicode? [ "𝄞" >json ] with-variable ] unit-test
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
! Copyright (C) 2006 Chris Double.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: accessors ascii assocs combinators fry hashtables io
|
||||
io.streams.string json kernel locals math math.parser mirrors
|
||||
namespaces sequences strings tr words ;
|
||||
USING: accessors ascii assocs combinators formatting fry
|
||||
hashtables io io.encodings.utf16.private io.streams.string json
|
||||
kernel locals math math.parser mirrors namespaces sequences
|
||||
strings tr words ;
|
||||
IN: json.writer
|
||||
|
||||
SYMBOL: json-allow-fp-special?
|
||||
|
@ -39,6 +40,26 @@ M: t stream-json-print
|
|||
M: json-null stream-json-print
|
||||
[ drop "null" ] [ stream-write ] bi* ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: json-print-generic-escape-surrogate-pair ( stream char -- stream )
|
||||
0x10000 - [ encode-first ] [ encode-second ] bi
|
||||
"\\u%x%x\\u%x%x" sprintf over stream-write ;
|
||||
|
||||
: json-print-generic-escape-bmp ( stream char -- stream )
|
||||
"\\u" pick stream-write
|
||||
>hex 4 CHAR: 0 pad-head
|
||||
over stream-write ;
|
||||
|
||||
: json-print-generic-escape ( stream char -- stream )
|
||||
dup 0xffff > [
|
||||
json-print-generic-escape-surrogate-pair
|
||||
] [
|
||||
json-print-generic-escape-bmp
|
||||
] if ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
M: string stream-json-print
|
||||
CHAR: " over stream-write1 swap [
|
||||
{
|
||||
|
@ -62,10 +83,7 @@ M: string stream-json-print
|
|||
{ [ dup control? ] [ t ] }
|
||||
[ json-escape-unicode? get ]
|
||||
} cond [
|
||||
dup 0xffff > [ json-error ] when
|
||||
"\\u" pick stream-write
|
||||
>hex 4 CHAR: 0 pad-head
|
||||
over stream-write
|
||||
json-print-generic-escape
|
||||
] [
|
||||
over stream-write1
|
||||
] if
|
||||
|
|
Loading…
Reference in New Issue