diff --git a/src/main/cpp/jsonlayout.cpp b/src/main/cpp/jsonlayout.cpp
index 66ff09f..a2e72c3 100644
--- a/src/main/cpp/jsonlayout.cpp
+++ b/src/main/cpp/jsonlayout.cpp
@@ -22,6 +22,7 @@
 #include <log4cxx/helpers/optionconverter.h>
 #include <log4cxx/helpers/iso8601dateformat.h>
 #include <log4cxx/helpers/stringhelper.h>
+#include <log4cxx/helpers/transcoder.h>
 
 #include <apr_time.h>
 #include <apr_strings.h>
@@ -38,8 +39,8 @@
 	locationInfo(false),
 	prettyPrint(false),
 	dateFormat(),
-	ppIndentL1("  "),
-	ppIndentL2("    ")
+	ppIndentL1(LOG4CXX_STR("  ")),
+	ppIndentL2(LOG4CXX_STR("    "))
 {
 }
 
@@ -62,72 +63,68 @@
 	const spi::LoggingEventPtr& event,
 	Pool& p) const
 {
-
-	output.append("{");
-	output.append(prettyPrint ? "\n" : " ");
+	output.append(LOG4CXX_STR("{"));
+	output.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		output.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(output, "timestamp");
-	output.append(": ");
+	appendQuotedEscapedString(output, LOG4CXX_STR("timestamp"));
+	output.append(LOG4CXX_STR(": "));
 	LogString timestamp;
 	dateFormat.format(timestamp, event->getTimeStamp(), p);
 	appendQuotedEscapedString(output, timestamp);
-	output.append(",");
-	output.append(prettyPrint ? "\n" : " ");
+	output.append(LOG4CXX_STR(","));
+	output.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		output.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(output, "level");
-	output.append(": ");
+	appendQuotedEscapedString(output, LOG4CXX_STR("level"));
+	output.append(LOG4CXX_STR(": "));
 	LogString level;
 	event->getLevel()->toString(level);
 	appendQuotedEscapedString(output, level);
-	output.append(",");
-	output.append(prettyPrint ? "\n" : " ");
+	output.append(LOG4CXX_STR(","));
+	output.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		output.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(output, "logger");
-	output.append(": ");
+	appendQuotedEscapedString(output, LOG4CXX_STR("logger"));
+	output.append(LOG4CXX_STR(": "));
 	appendQuotedEscapedString(output, event->getLoggerName());
-	output.append(",");
-	output.append(prettyPrint ? "\n" : " ");
+	output.append(LOG4CXX_STR(","));
+	output.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		output.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(output, "message");
-	output.append(": ");
+	appendQuotedEscapedString(output, LOG4CXX_STR("message"));
+	output.append(LOG4CXX_STR(": "));
 	appendQuotedEscapedString(output, event->getMessage());
 
 	appendSerializedMDC(output, event);
-
 	appendSerializedNDC(output, event);
 
-
 	if (locationInfo)
 	{
-		output.append(",");
-		output.append(prettyPrint ? "\n" : " ");
+		output.append(LOG4CXX_STR(","));
+		output.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 		appendSerializedLocationInfo(output, event, p);
 	}
 
-	output.append(prettyPrint ? "\n" : " ");
-	output.append("}");
+	output.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
+	output.append(LOG4CXX_STR("}"));
 	output.append(LOG4CXX_EOL);
-
 }
 
 void JSONLayout::appendQuotedEscapedString(LogString& buf,
@@ -147,7 +144,6 @@
 		0x5c    /* \\ backslash         */
 	};
 
-
 	size_t start = 0;
 	size_t found = input.find_first_of(specialChars, start);
 
@@ -226,13 +222,11 @@
 
 	/* add trailing quote */
 	buf.push_back(0x22);
-
 }
 
 void JSONLayout::appendSerializedMDC(LogString& buf,
 	const LoggingEventPtr& event) const
 {
-
 	LoggingEvent::KeySet keys = event->getMDCKeySet();
 
 	if (keys.empty())
@@ -240,17 +234,17 @@
 		return;
 	}
 
-	buf.append(",");
-	buf.append(prettyPrint ? "\n" : " ");
+	buf.append(LOG4CXX_STR(","));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(buf, "context_map");
-	buf.append(": {");
-	buf.append(prettyPrint ? "\n" : " ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("context_map"));
+	buf.append(LOG4CXX_STR(": {"));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	for (LoggingEvent::KeySet::iterator it = keys.begin();
 		it != keys.end(); ++it)
@@ -261,7 +255,7 @@
 		}
 
 		appendQuotedEscapedString(buf, *it);
-		buf.append(": ");
+		buf.append(LOG4CXX_STR(": "));
 		LogString value;
 		event->getMDC(*it, value);
 		appendQuotedEscapedString(buf, value);
@@ -269,12 +263,12 @@
 		/* if this isn't the last k:v pair, we need a comma */
 		if (it + 1 != keys.end())
 		{
-			buf.append(",");
-			buf.append(prettyPrint ? "\n" : " ");
+			buf.append(LOG4CXX_STR(","));
+			buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 		}
 		else
 		{
-			buf.append(prettyPrint ? "\n" : " ");
+			buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 		}
 	}
 
@@ -283,14 +277,12 @@
 		buf.append(ppIndentL1);
 	}
 
-	buf.append("}");
-
+	buf.append(LOG4CXX_STR("}"));
 }
 
 void JSONLayout::appendSerializedNDC(LogString& buf,
 	const LoggingEventPtr& event) const
 {
-
 	LogString ndcVal;
 
 	if (!event->getNDC(ndcVal))
@@ -298,17 +290,17 @@
 		return;
 	}
 
-	buf.append(",");
-	buf.append(prettyPrint ? "\n" : " ");
+	buf.append(LOG4CXX_STR(","));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(buf, "context_stack");
-	buf.append(": [");
-	buf.append(prettyPrint ? "\n" : " ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("context_stack"));
+	buf.append(LOG4CXX_STR(": ["));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
@@ -316,29 +308,27 @@
 	}
 
 	appendQuotedEscapedString(buf, ndcVal);
-	buf.append(prettyPrint ? "\n" : " ");
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL1);
 	}
 
-	buf.append("]");
-
+	buf.append(LOG4CXX_STR("]"));
 }
 
 void JSONLayout::appendSerializedLocationInfo(LogString& buf,
 	const LoggingEventPtr& event, Pool& p) const
 {
-
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL1);
 	}
 
-	appendQuotedEscapedString(buf, "location_info");
-	buf.append(": {");
-	buf.append(prettyPrint ? "\n" : " ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("location_info"));
+	buf.append(LOG4CXX_STR(": {"));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 	const LocationInfo& locInfo = event->getLocationInformation();
 
 	if (prettyPrint)
@@ -346,53 +336,54 @@
 		buf.append(ppIndentL2);
 	}
 
-	appendQuotedEscapedString(buf, "file");
-	buf.append(": ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("file"));
+	buf.append(LOG4CXX_STR(": "));
 	LOG4CXX_DECODE_CHAR(fileName, locInfo.getFileName());
 	appendQuotedEscapedString(buf, fileName);
-	buf.append(",");
-	buf.append(prettyPrint ? "\n" : " ");
+	buf.append(LOG4CXX_STR(","));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL2);
 	}
 
-	appendQuotedEscapedString(buf, "line");
-	buf.append(": ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("line"));
+	buf.append(LOG4CXX_STR(": "));
 	LogString lineNumber;
 	StringHelper::toString(locInfo.getLineNumber(), p, lineNumber);
 	appendQuotedEscapedString(buf, lineNumber);
-	buf.append(",");
-	buf.append(prettyPrint ? "\n" : " ");
+	buf.append(LOG4CXX_STR(","));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL2);
 	}
 
-	appendQuotedEscapedString(buf, "class");
-	buf.append(": ");
-	appendQuotedEscapedString(buf, locInfo.getClassName());
-	buf.append(",");
-	buf.append(prettyPrint ? "\n" : " ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("class"));
+	buf.append(LOG4CXX_STR(": "));
+	LOG4CXX_DECODE_CHAR(className, locInfo.getClassName());
+	appendQuotedEscapedString(buf, className);
+	buf.append(LOG4CXX_STR(","));
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL2);
 	}
 
-	appendQuotedEscapedString(buf, "method");
-	buf.append(": ");
-	appendQuotedEscapedString(buf, locInfo.getMethodName());
-	buf.append(prettyPrint ? "\n" : " ");
+	appendQuotedEscapedString(buf, LOG4CXX_STR("method"));
+	buf.append(LOG4CXX_STR(": "));
+	LOG4CXX_DECODE_CHAR(methodName, locInfo.getMethodName());
+	appendQuotedEscapedString(buf, methodName);
+	buf.append(prettyPrint ? LOG4CXX_EOL : LOG4CXX_STR(" "));
 
 	if (prettyPrint)
 	{
 		buf.append(ppIndentL1);
 	}
 
-	buf.append("}");
-
+	buf.append(LOG4CXX_STR("}"));
 }
 
diff --git a/src/test/cpp/jsonlayouttest.cpp b/src/test/cpp/jsonlayouttest.cpp
index 88862da..de1d074 100644
--- a/src/test/cpp/jsonlayouttest.cpp
+++ b/src/test/cpp/jsonlayouttest.cpp
@@ -101,24 +101,23 @@
 	 */
 	void testAppendQuotedEscapedStringWithPrintableChars()
 	{
-
-		LogString s1("foo");                  /*  foo */
+		LogString s1(LOG4CXX_STR("foo"));	/*  foo */
 		LogString s2;
-		appendQuotedEscapedString(s2, s1);    /*  "foo"  */
-		LOGUNIT_ASSERT_EQUAL("\"foo\"", s2);
+		appendQuotedEscapedString(s2, s1);	/*  "foo"  */
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\"foo\""), s2);
 
 		LogString s3;
-		appendQuotedEscapedString(s3, s2);    /*  "\"foo\""  */
-		LOGUNIT_ASSERT_EQUAL("\"\\\"foo\\\"\"", s3);
+		appendQuotedEscapedString(s3, s2);	/*  "\"foo\""  */
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\"\\\"foo\\\"\""), s3);
 
-		LogString t1("bar\"baz");             /*  bar"baz */
+		LogString t1(LOG4CXX_STR("bar\"baz"));	/*  bar"baz */
 		LogString t2;
-		appendQuotedEscapedString(t2, t1);    /*  "bar\"baz"  */
-		LOGUNIT_ASSERT_EQUAL("\"bar\\\"baz\"", t2);
+		appendQuotedEscapedString(t2, t1);		/*  "bar\"baz"  */
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\"bar\\\"baz\""), t2);
 
 		LogString t3;
-		appendQuotedEscapedString(t3, t2);    /*  "\"bar\\\"baz\""    */
-		LOGUNIT_ASSERT_EQUAL("\"\\\"bar\\\\\\\"baz\\\"\"", t3);
+		appendQuotedEscapedString(t3, t2);		/*  "\"bar\\\"baz\""    */
+		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("\"\\\"bar\\\\\\\"baz\\\"\""), t3);
 	}
 
 	/**
@@ -126,37 +125,40 @@
 	 */
 	void testAppendQuotedEscapedStringWithControlChars()
 	{
-
-		LogString bs = {0x08};
-		LogString bs_expected = {0x22, 0x5c, 'b', 0x22};      /* "\b" */
+		logchar bs[] = {0x08, 0x00};
+		logchar bs_expected[] = {0x22, 0x5c, 'b', 0x22, 0x00};      /* "\b" */
 		LogString bs_escaped;
+
 		appendQuotedEscapedString(bs_escaped, bs);
 		LOGUNIT_ASSERT_EQUAL(bs_expected, bs_escaped);
 
-		LogString tab = {0x09};
-		LogString tab_expected = {0x22, 0x5c, 't', 0x22};     /* "\t" */
+		logchar tab[] = {0x09, 0x00};
+		logchar tab_expected[] = {0x22, 0x5c, 't', 0x22, 0x00};     /* "\t" */
 		LogString tab_escaped;
+
 		appendQuotedEscapedString(tab_escaped, tab);
 		LOGUNIT_ASSERT_EQUAL(tab_expected, tab_escaped);
 
-		LogString newline = {0x0a};
-		LogString newline_expected = {0x22, 0x5c, 'n', 0x22}; /* "\n" */
+		logchar newline[] = {0x0a, 0x00};
+		logchar newline_expected[] = {0x22, 0x5c, 'n', 0x22, 0x00}; /* "\n" */
 		LogString newline_escaped;
+
 		appendQuotedEscapedString(newline_escaped, newline);
 		LOGUNIT_ASSERT_EQUAL(newline_expected, newline_escaped);
 
-		LogString ff = {0x0c};
-		LogString ff_expected = {0x22, 0x5c, 'f', 0x22};      /* "\f" */
+		logchar ff[] = {0x0c, 0x00};
+		logchar ff_expected[] = {0x22, 0x5c, 'f', 0x22, 0x00};      /* "\f" */
 		LogString ff_escaped;
+
 		appendQuotedEscapedString(ff_escaped, ff);
 		LOGUNIT_ASSERT_EQUAL(ff_expected, ff_escaped);
 
-		LogString cr = {0x0d};
-		LogString cr_expected = {0x22, 0x5c, 'r', 0x22};      /* "\r" */
+		logchar cr[] = {0x0d, 0x00};
+		logchar cr_expected[] = {0x22, 0x5c, 'r', 0x22, 0x00};      /* "\r" */
 		LogString cr_escaped;
+
 		appendQuotedEscapedString(cr_escaped, cr);
 		LOGUNIT_ASSERT_EQUAL(cr_expected, cr_escaped);
-
 	}
 
 	/**
@@ -164,7 +166,6 @@
 	 */
 	void testAppendSerializedMDC()
 	{
-
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
 			Level::getInfo(),
 			LOG4CXX_STR("A message goes here."),
@@ -174,13 +175,11 @@
 		MDC::put("key2", "value2");
 
 		LogString output1;
-		LogString expected1 = ", \"context_map\": { "
-			"\"key1\": \"value1\", \"key2\": \"value2\" }";
+		LogString expected1 = LOG4CXX_STR(", \"context_map\": { "
+			"\"key1\": \"value1\", \"key2\": \"value2\" }");
 
 		appendSerializedMDC(output1, event1);
-
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
 	/**
@@ -188,7 +187,6 @@
 	 */
 	void testAppendSerializedMDCWithPrettyPrint()
 	{
-
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
 			Level::getInfo(),
 			LOG4CXX_STR("A message goes here."),
@@ -198,33 +196,34 @@
 		MDC::put("key2", "value2");
 
 		LogString output1;
-
 		LogString expected1;
-		expected1.append(",\n")
-		.append(ppIndentL1)
-		.append("\"context_map\": {\n")
-		.append(ppIndentL2)
-		.append("\"key1\": \"value1\",\n")
-		.append(ppIndentL2)
-		.append("\"key2\": \"value2\"\n")
-		.append(ppIndentL1)
-		.append("}");
+
+		expected1
+			.append(LOG4CXX_STR(","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"context_map\": {"))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"key1\": \"value1\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"key2\": \"value2\""))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("}"));
 
 		setPrettyPrint(true);
 		appendSerializedMDC(output1, event1);
 
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
-
-
 	/**
 	 * Tests appendSerializedNDC.
 	 */
 	void testAppendSerializedNDC()
 	{
-
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
 			Level::getInfo(),
 			LOG4CXX_STR("A message goes here."),
@@ -235,21 +234,17 @@
 		NDC::push("three");
 
 		LogString output1;
-		LogString expected1 = ", \"context_stack\": [ \"one two three\" ]";
+		LogString expected1 = LOG4CXX_STR(", \"context_stack\": [ \"one two three\" ]");
 
 		appendSerializedNDC(output1, event1);
-
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
-
 	/**
 	 * Tests appendSerializedNDC with prettyPrint set to true.
 	 */
 	void testAppendSerializedNDCWithPrettyPrint()
 	{
-
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
 			Level::getInfo(),
 			LOG4CXX_STR("A message goes here."),
@@ -261,20 +256,23 @@
 
 		LogString output1;
 		LogString expected1;
-		expected1.append(",\n")
-		.append(ppIndentL1)
-		.append("\"context_stack\": [\n")
-		.append(ppIndentL2)
-		.append("\"one two three\"\n")
-		.append(ppIndentL1)
-		.append("]");
+
+		expected1
+			.append(LOG4CXX_STR(","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"context_stack\": ["))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"one two three\""))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("]"));
 
 		setPrettyPrint(true);
-
 		appendSerializedNDC(output1, event1);
 
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
 	/**
@@ -291,16 +289,16 @@
 
 		LogString output1;
 		LogString expected1;
-		expected1.append("\"location_info\": { ")
-		.append("\"file\": \"FooFile\", ")
-		.append("\"line\": \"42\", ")
-		.append("\"class\": \"\", ")
-		.append("\"method\": \"BarFunc\" }");
+
+		expected1
+			.append(LOG4CXX_STR("\"location_info\": { "))
+			.append(LOG4CXX_STR("\"file\": \"FooFile\", "))
+			.append(LOG4CXX_STR("\"line\": \"42\", "))
+			.append(LOG4CXX_STR("\"class\": \"\", "))
+			.append(LOG4CXX_STR("\"method\": \"BarFunc\" }"));
 
 		appendSerializedLocationInfo(output1, event1, p);
-
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
 	/**
@@ -308,7 +306,6 @@
 	 */
 	void testAppendSerializedLocationInfoWithPrettyPrint()
 	{
-
 		Pool p;
 
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
@@ -318,34 +315,37 @@
 
 		LogString output1;
 		LogString expected1;
-		expected1.append(ppIndentL1)
-		.append("\"location_info\": {\n")
-		.append(ppIndentL2)
-		.append("\"file\": \"FooFile\",\n")
-		.append(ppIndentL2)
-		.append("\"line\": \"42\",\n")
-		.append(ppIndentL2)
-		.append("\"class\": \"\",\n")
-		.append(ppIndentL2)
-		.append("\"method\": \"BarFunc\"\n")
-		.append(ppIndentL1)
-		.append("}");
+
+		expected1
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"location_info\": {"))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"file\": \"FooFile\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"line\": \"42\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"class\": \"\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL2)
+			.append(LOG4CXX_STR("\"method\": \"BarFunc\""))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("}"));
 
 		setPrettyPrint(true);
 		appendSerializedLocationInfo(output1, event1, p);
 
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
-
-
 	/**
 	 * Tests format.
 	 */
 	void testFormat()
 	{
-
 		Pool p;
 
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
@@ -367,33 +367,33 @@
 		LogString output1;
 		LogString expected1;
 
-		expected1.append("{ \"timestamp\": \"")
-		.append(timestamp)
-		.append("\", ")
-		.append("\"level\": \"INFO\", ")
-		.append("\"logger\": \"Logger\", ")
-		.append("\"message\": \"A message goes here.\"");
+		expected1
+			.append(LOG4CXX_STR("{ \"timestamp\": \""))
+			.append(timestamp)
+			.append(LOG4CXX_STR("\", "))
+			.append(LOG4CXX_STR("\"level\": \"INFO\", "))
+			.append(LOG4CXX_STR("\"logger\": \"Logger\", "))
+			.append(LOG4CXX_STR("\"message\": \"A message goes here.\""));
 
 		setLocationInfo(true);
 
 		appendSerializedMDC(expected1, event1);
 		appendSerializedNDC(expected1, event1);
-		expected1.append(", ");
+		expected1.append(LOG4CXX_STR(", "));
 		appendSerializedLocationInfo(expected1, event1, p);
 
-		expected1.append(" }\n");
-
+		expected1.append(LOG4CXX_STR(" }"));
+		expected1.append(LOG4CXX_EOL);
 		format(output1, event1, p);
 
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
+
 	/**
 	 * Tests format with PrettyPrint set to true.
 	 */
 	void testFormatWithPrettyPrint()
 	{
-
 		Pool p;
 
 		LoggingEventPtr event1 = new LoggingEvent(LOG4CXX_STR("Logger"),
@@ -415,36 +415,40 @@
 		LogString output1;
 		LogString expected1;
 
-		expected1.append("{\n")
-		.append(ppIndentL1)
-		.append("\"timestamp\": \"")
-		.append(timestamp)
-		.append("\",\n")
-		.append(ppIndentL1)
-		.append("\"level\": \"INFO\",\n")
-		.append(ppIndentL1)
-		.append("\"logger\": \"Logger\",\n")
-		.append(ppIndentL1)
-		.append("\"message\": \"A message goes here.\"");
-
+		expected1
+			.append(LOG4CXX_STR("{"))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"timestamp\": \""))
+			.append(timestamp)
+			.append(LOG4CXX_STR("\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"level\": \"INFO\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"logger\": \"Logger\","))
+			.append(LOG4CXX_EOL)
+			.append(ppIndentL1)
+			.append(LOG4CXX_STR("\"message\": \"A message goes here.\""));
 
 		setPrettyPrint(true);
 		setLocationInfo(true);
 
 		appendSerializedMDC(expected1, event1);
 		appendSerializedNDC(expected1, event1);
-		expected1.append(",\n");
+		expected1.append(LOG4CXX_STR(","));
+		expected1.append(LOG4CXX_EOL);
 		appendSerializedLocationInfo(expected1, event1, p);
 
-		expected1.append("\n}\n");
-
+		expected1.append(LOG4CXX_EOL);
+		expected1.append(LOG4CXX_STR("}"));
+		expected1.append(LOG4CXX_EOL);
 		format(output1, event1, p);
 
 		LOGUNIT_ASSERT_EQUAL(expected1, output1);
-
 	}
 
-
 	/**
 	 * Tests getLocationInfo and setLocationInfo.
 	 */
@@ -470,7 +474,6 @@
 		layout.setPrettyPrint(false);
 		LOGUNIT_ASSERT_EQUAL(false, layout.getPrettyPrint());
 	}
-
 };
 
 
