Skip to content

Commit 1cd7459

Browse files
committed
Merge pull request pocoproject#315 from fbraem/develop
Solve wrong escaping of unicode characters
2 parents 98960a2 + 65988bb commit 1cd7459

2 files changed

Lines changed: 35 additions & 35 deletions

File tree

‎JSON/src/Stringifier.cpp‎

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -92,41 +92,41 @@ void Stringifier::formatString(const std::string& value, std::ostream& out)
9292
out << '"';
9393
for (std::string::const_iterator it = value.begin(); it != value.end(); ++it)
9494
{
95-
switch (*it)
96-
{
97-
case '"':
95+
if (*it == 0x20 ||
96+
*it == 0x21 ||
97+
(*it >= 0x23 && *it <= 0x2E) ||
98+
(*it >= 0x30 && *it <= 0x5B) ||
99+
(*it >= 0x5D && *it <= 0xFF))
100+
out << *it;
101+
else if (*it == '"')
98102
out << "\\\"";
99-
break;
100-
case '\\':
103+
else if (*it == '\\')
101104
out << "\\\\";
102-
break;
103-
case '\b':
105+
else if (*it == '\b')
104106
out << "\\b";
105-
break;
106-
case '\f':
107+
else if (*it == '\f')
107108
out << "\\f";
108-
break;
109-
case '\n':
109+
else if (*it == '\n')
110110
out << "\\n";
111-
break;
112-
case '\r':
111+
else if (*it == '\r')
113112
out << "\\r";
114-
break;
115-
case '\t':
113+
else if (*it == '\t')
116114
out << "\\t";
117-
break;
118-
default:
115+
else if ( *it == '\0' )
116+
out << "\\u0000";
117+
else
119118
{
120-
if ( *it > 0 && *it <= 0x1F )
121-
{
122-
out << "\\u" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*it);
123-
}
124-
else
125-
{
126-
out << *it;
127-
}
128-
break;
129-
}
119+
const char *hexdigits = "0123456789ABCDEF";
120+
unsigned long u = (std::min)(static_cast<unsigned long>(static_cast<unsigned char>(*it)), 0xFFFFul);
121+
int d1 = u / 4096; u -= d1 * 4096;
122+
int d2 = u / 256; u -= d2 * 256;
123+
int d3 = u / 16; u -= d3 * 16;
124+
int d4 = u;
125+
out << "\\u";
126+
out << hexdigits[d1];
127+
out << hexdigits[d2];
128+
out << hexdigits[d3];
129+
out << hexdigits[d4];
130130
}
131131
}
132132
out << '"';

‎MongoDB/include/Poco/MongoDB/MessageHeader.h‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class MongoDB_API MessageHeader
7676
void write(BinaryWriter& writer);
7777
/// Writes the header
7878

79-
std::size_t getMessageLength() const;
79+
Int32 getMessageLength() const;
8080
/// Returns the message length
8181

8282
OpCode opCode() const;
@@ -95,13 +95,13 @@ class MongoDB_API MessageHeader
9595
MessageHeader(OpCode opcode);
9696
/// Constructor.
9797

98-
void setMessageLength(std::size_t length);
98+
void setMessageLength(Int32 length);
9999
/// Sets the message length
100100

101-
std::size_t _messageLength;
102-
Int32 _requestID;
103-
Int32 _responseTo;
104-
OpCode _opCode;
101+
Int32 _messageLength;
102+
Int32 _requestID;
103+
Int32 _responseTo;
104+
OpCode _opCode;
105105

106106
friend class Message;
107107
};
@@ -113,13 +113,13 @@ inline MessageHeader::OpCode MessageHeader::opCode() const
113113
}
114114

115115

116-
inline std::size_t MessageHeader::getMessageLength() const
116+
inline Int32 MessageHeader::getMessageLength() const
117117
{
118118
return _messageLength;
119119
}
120120

121121

122-
inline void MessageHeader::setMessageLength(std::size_t length)
122+
inline void MessageHeader::setMessageLength(Int32 length)
123123
{
124124
_messageLength = MSG_HEADER_SIZE + length;
125125
}

0 commit comments

Comments
 (0)