Skip to content

Commit

Permalink
Revert "Revert "Merge pull request #45 from RangelReale/jsonunicode""
Browse files Browse the repository at this point in the history
This reverts commit 52867ed.
  • Loading branch information
aleks-f committed Dec 29, 2012
1 parent 52867ed commit 86647bd
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 10 deletions.
26 changes: 16 additions & 10 deletions JSON/src/Parser.cpp
Expand Up @@ -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 <limits>
Expand Down Expand Up @@ -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
{
Expand Down Expand Up @@ -196,16 +197,21 @@ 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:
{
throw JSONException(format("Invalid escape '%c' character used", (char) c));
}
}
}else{
_value += c;
}
_value += c;
c = istr.get();
}

Expand Down
30 changes: 30 additions & 0 deletions JSON/testsuite/src/JSONTest.cpp
Expand Up @@ -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<Object::Ptr>();
Var test = object->get("test");
assert(test.convert<std::string>() == text);
}


std::string JSONTest::getTestFilesPath(const std::string& type)
{
std::ostringstream ostr;
Expand Down Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions JSON/testsuite/src/JSONTest.h
Expand Up @@ -76,6 +76,7 @@ class JSONTest: public CppUnit::TestCase
void testInvalidJanssonFiles();
void testTemplate();
void testItunes();
void testUnicode();

void setUp();
void tearDown();
Expand Down

0 comments on commit 86647bd

Please sign in to comment.