add unicode escapes support
This commit is contained in:
parent
8dac3ffdac
commit
65f9caec87
@ -360,6 +360,13 @@ std::string BasicParser::parseString(char quote, bool closeRequired) {
|
|||||||
ss << (char)parseSimpleInt(8);
|
ss << (char)parseSimpleInt(8);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (c == 'u') {
|
||||||
|
int codepoint = parseSimpleInt(16);
|
||||||
|
ubyte bytes[4];
|
||||||
|
int size = util::encode_utf8(codepoint, bytes);
|
||||||
|
ss.write(reinterpret_cast<char*>(bytes), size);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'n': ss << '\n'; break;
|
case 'n': ss << '\n'; break;
|
||||||
case 'r': ss << '\r'; break;
|
case 'r': ss << '\r'; break;
|
||||||
|
|||||||
@ -11,7 +11,9 @@
|
|||||||
std::string util::escape(const std::string& s) {
|
std::string util::escape(const std::string& s) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << '"';
|
ss << '"';
|
||||||
for (char c : s) {
|
size_t pos = 0;
|
||||||
|
while (pos < s.length()) {
|
||||||
|
char c = s[pos];
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '\n':
|
case '\n':
|
||||||
ss << "\\n";
|
ss << "\\n";
|
||||||
@ -35,6 +37,13 @@ std::string util::escape(const std::string& s) {
|
|||||||
ss << "\\\\";
|
ss << "\\\\";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (c & 0x80) {
|
||||||
|
uint cpsize;
|
||||||
|
int codepoint = decode_utf8(cpsize, s.data() + pos);
|
||||||
|
pos += cpsize-1;
|
||||||
|
ss << "\\u" << std::hex << codepoint;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (c < ' ') {
|
if (c < ' ') {
|
||||||
ss << "\\" << std::oct << uint(ubyte(c));
|
ss << "\\" << std::oct << uint(ubyte(c));
|
||||||
break;
|
break;
|
||||||
@ -42,6 +51,7 @@ std::string util::escape(const std::string& s) {
|
|||||||
ss << c;
|
ss << c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
pos++;
|
||||||
}
|
}
|
||||||
ss << '"';
|
ss << '"';
|
||||||
return ss.str();
|
return ss.str();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user