Ticket #8883: json_parser_diff.txt

File json_parser_diff.txt, 1.9 KB (added by ecotax@…, 9 years ago)

property_tree json_parser_read UTF-8 patch

Line 
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