diff --git a/JSON/src/Parser.cpp b/JSON/src/Parser.cpp index 54fe97239c..96de1b3362 100644 --- a/JSON/src/Parser.cpp +++ b/JSON/src/Parser.cpp @@ -38,6 +38,7 @@ #include "Poco/JSON/JSONException.h" #include "Poco/Ascii.h" #include "Poco/Token.h" +#include "Poco/UnicodeConverter.h" #undef min #undef max #include @@ -140,28 +141,28 @@ class StringToken: public Token switch(c) { case '"' : - c = '"'; + _value += '"'; break; case '\\' : - c = '\\'; + _value += '\\'; break; case '/' : - c = '/'; + _value += '/'; break; case 'b' : - c = '\b'; + _value += '\b'; break; case 'f' : - c = '\f'; + _value += '\f'; break; case 'n' : - c = '\n'; + _value += '\n'; break; case 'r' : - c = '\r'; + _value += '\r'; break; case 't' : - c = '\t'; + _value += '\t'; break; case 'u' : // Unicode { @@ -196,7 +197,11 @@ class StringToken: public Token { throw JSONException("Invalid unicode"); } - c = unicode; + //unicode to utf8 + std::string utf8; + UnicodeConverter::toUTF8((const UTF32Char*)&unicode,1,utf8); + _value += utf8; + break; } default: @@ -204,8 +209,9 @@ class StringToken: public Token throw JSONException(format("Invalid escape '%c' character used", (char) c)); } } + }else{ + _value += c; } - _value += c; c = istr.get(); } diff --git a/JSON/testsuite/src/JSONTest.cpp b/JSON/testsuite/src/JSONTest.cpp index dbb2521da7..f51173232a 100644 --- a/JSON/testsuite/src/JSONTest.cpp +++ b/JSON/testsuite/src/JSONTest.cpp @@ -859,6 +859,35 @@ void JSONTest::testTemplate() } +void JSONTest::testUnicode() +{ + const unsigned char supp[] = {0x61, 0xE1, 0xE9, 0x78, 0xED, 0xF3, 0xFA, 0x0}; + std::string text((const char*) supp); + + std::string json = "{ \"test\" : \"a\u00E1\u00E9x\u00ED\u00F3\u00FA\" }"; + Parser parser; + + Var result; + try + { + DefaultHandler handler; + parser.setHandler(&handler); + parser.parse(json); + result = handler.result(); + } + catch(JSONException& jsone) + { + std::cout << jsone.message() << std::endl; + assert(false); + } + assert(result.type() == typeid(Object::Ptr)); + + Object::Ptr object = result.extract(); + Var test = object->get("test"); + assert(test.convert() == text); +} + + std::string JSONTest::getTestFilesPath(const std::string& type) { std::ostringstream ostr; @@ -918,6 +947,7 @@ CppUnit::Test* JSONTest::suite() CppUnit_addTest(pSuite, JSONTest, testValidJanssonFiles); CppUnit_addTest(pSuite, JSONTest, testInvalidJanssonFiles); CppUnit_addTest(pSuite, JSONTest, testTemplate); + CppUnit_addTest(pSuite, JSONTest, testUnicode); return pSuite; } diff --git a/JSON/testsuite/src/JSONTest.h b/JSON/testsuite/src/JSONTest.h index 956181b09d..ac64e2fd53 100644 --- a/JSON/testsuite/src/JSONTest.h +++ b/JSON/testsuite/src/JSONTest.h @@ -76,6 +76,7 @@ class JSONTest: public CppUnit::TestCase void testInvalidJanssonFiles(); void testTemplate(); void testItunes(); + void testUnicode(); void setUp(); void tearDown();