| 1 | --- json_parser_read.hpp.orig
|
|---|
| 2 | +++ json_parser_read.hpp
|
|---|
| 3 | @@ -146,8 +146,45 @@
|
|---|
| 4 | a_unicode(context &c): c(c) { }
|
|---|
| 5 | void operator()(unsigned long u) const
|
|---|
| 6 | {
|
|---|
| 7 | - u = (std::min)(u, static_cast<unsigned long>((std::numeric_limits<Ch>::max)()));
|
|---|
| 8 | - c.string += Ch(u);
|
|---|
| 9 | + if (((std::numeric_limits<Ch>::max)()) > 0xFF)
|
|---|
| 10 | + {
|
|---|
| 11 | + u = (std::min)(u, static_cast<unsigned long>((std::numeric_limits<Ch>::max)()));
|
|---|
| 12 | + c.string += Ch(u);
|
|---|
| 13 | + }
|
|---|
| 14 | + else // Ch is one byte - encode the given Unicode code point as UTF-8
|
|---|
| 15 | + {
|
|---|
| 16 | + if (u < 0x80)
|
|---|
| 17 | + {
|
|---|
| 18 | + c.string += Ch(u);
|
|---|
| 19 | + }
|
|---|
| 20 | + else if (u < 0x800)
|
|---|
| 21 | + {
|
|---|
| 22 | + Ch c1 = 0xC0 + (u >> 6);
|
|---|
| 23 | + Ch c2 = 0x80 + (u % 0x40);
|
|---|
| 24 | + c.string += c1;
|
|---|
| 25 | + c.string += c2;
|
|---|
| 26 | + }
|
|---|
| 27 | + else if (u < 0xD800 || u >= 0xE000)
|
|---|
| 28 | + {
|
|---|
| 29 | + Ch c1 = 0xE0 + (u >> 12);
|
|---|
| 30 | + Ch c2 = 0x80 + ((u % 0x1000) >> 6);
|
|---|
| 31 | + Ch c3 = 0x80 + (u % 0x40);
|
|---|
| 32 | + c.string += c1;
|
|---|
| 33 | + c.string += c2;
|
|---|
| 34 | + c.string += c3;
|
|---|
| 35 | + }
|
|---|
| 36 | + else
|
|---|
| 37 | + {
|
|---|
| 38 | + Ch c1 = 0xF0 + (u >> 18);
|
|---|
| 39 | + Ch c2 = 0x80 + ((u % 0x40000) >> 12);
|
|---|
| 40 | + Ch c3 = 0x80 + ((u % 0x1000) >> 6);
|
|---|
| 41 | + Ch c4 = 0x80 + (u % 0x40);
|
|---|
| 42 | + c.string += c1;
|
|---|
| 43 | + c.string += c2;
|
|---|
| 44 | + c.string += c3;
|
|---|
| 45 | + c.string += c4;
|
|---|
| 46 | + }
|
|---|
| 47 | + }
|
|---|
| 48 | }
|
|---|
| 49 | };
|
|---|
| 50 |
|
|---|