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 |
|
---|