nhttpd try to fix json unicode output

This commit is contained in:
Jacek Jendrzej
2016-02-18 23:44:15 +01:00
parent 219ce9c8ed
commit 201f8758c6

View File

@@ -292,17 +292,58 @@ std::string json_out_error(std::string _error) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// JSON: convert string to JSON-String // JSON: convert string to JSON-String
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
std::string json_convert_string(std::string s) { std::string json_convert_string(std::string s) {
std::stringstream ss; std::stringstream ss;
for (size_t i = 0; i < s.length(); ++i) { for (size_t i = 0; i < s.length(); ) {
if (unsigned(s[i]) < '\x20' || s[i] == '\\' || s[i] == '"' || unsigned(s[i]) >= '\x80') { unsigned char ch = unsigned(s[i]);
ss << "\\u" << std::setfill('0') << std::setw(4) << std::hex if(ch == 0x0d){
<< unsigned(s[i]); ss << "\\u000d";
i++;
continue;
}
if(ch == 0x0a){
ss << "\\u000a";
i++;
continue;
}
if(ch < '\x20' || ch == '\\' || ch == '"' || ch >= '\x80') {
unsigned long unicode = 0;
size_t todo = 0;
if (ch <= 0xBF) {
}
else if (ch <= 0xDF) {
unicode = ch & 0x1F;
todo = 1;
}
else if (ch <= 0xEF) {
unicode = ch & 0x0F;
todo = 2;
}
else if (ch <= 0xF7) {
unicode = ch & 0x07;
todo = 3;
}
for (size_t j = 0; j < todo; ++j){
++i;
unicode <<= 6;
unicode += unsigned(s[i]) & 0x3F;
}
if (unicode <= 0xFFFF)
{
ss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << unicode;
}else
{
unicode -= 0x10000;
ss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << ((unicode >> 10) + 0xD800);
ss << "\\u" << std::setfill('0') << std::setw(4) << std::hex << ((unicode & 0x3FF) + 0xDC00);
}
} }
else { else {
ss << s[i]; ss << s[i];
} }
++i;
} }
return ss.str(); return ss.str();
} }