--- json_parser_read.hpp.orig +++ json_parser_read.hpp @@ -146,8 +146,45 @@ a_unicode(context &c): c(c) { } void operator()(unsigned long u) const { - u = (std::min)(u, static_cast((std::numeric_limits::max)())); - c.string += Ch(u); + if (((std::numeric_limits::max)()) > 0xFF) + { + u = (std::min)(u, static_cast((std::numeric_limits::max)())); + c.string += Ch(u); + } + else // Ch is one byte - encode the given Unicode code point as UTF-8 + { + if (u < 0x80) + { + c.string += Ch(u); + } + else if (u < 0x800) + { + Ch c1 = 0xC0 + (u >> 6); + Ch c2 = 0x80 + (u % 0x40); + c.string += c1; + c.string += c2; + } + else if (u < 0xD800 || u >= 0xE000) + { + Ch c1 = 0xE0 + (u >> 12); + Ch c2 = 0x80 + ((u % 0x1000) >> 6); + Ch c3 = 0x80 + (u % 0x40); + c.string += c1; + c.string += c2; + c.string += c3; + } + else + { + Ch c1 = 0xF0 + (u >> 18); + Ch c2 = 0x80 + ((u % 0x40000) >> 12); + Ch c3 = 0x80 + ((u % 0x1000) >> 6); + Ch c4 = 0x80 + (u % 0x40); + c.string += c1; + c.string += c2; + c.string += c3; + c.string += c4; + } + } } };