diff --git a/jv.c b/jv.c index bf3d4f83..80e3ac91 100644 --- a/jv.c +++ b/jv.c @@ -717,7 +717,10 @@ jv jv_string_implode(jv j) { for (i = 0; i < len; i++) { jv n = jv_array_get(jv_copy(j), i); assert(jv_get_kind(n) == JV_KIND_NUMBER); - s = jv_string_append_codepoint(s, jv_number_value(n)); + int nv = jv_number_value(n); + if (nv > 0x10FFFF) + nv = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER + s = jv_string_append_codepoint(s, nv); } jv_free(j); diff --git a/jv_parse.c b/jv_parse.c index d560bd69..63d53949 100644 --- a/jv_parse.c +++ b/jv_parse.c @@ -447,7 +447,8 @@ static pfunc found_string(struct jv_parser* p) { codepoint = 0x10000 + (((codepoint - 0xD800) << 10) |(surrogate - 0xDC00)); } - // FIXME assert valid codepoint + if (codepoint > 0x10FFFF) + codepoint = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER out += jvp_utf8_encode(codepoint, out); break;