根本原因是因为在解析此类字符时,对于文字的后半部分解析成了'\\' 。造成了后续的识别错误。
采用的方法是:根据字符前半部分来判断文字类型,对于文字直接获取下半部分
bool
Reader::decodeString( Token &token, std::string &decoded )
{
decoded.reserve( token.end_ - token.start_ - 2 );
Location current = token.start_ + 1; // skip '"'
Location end = token.end_ - 1; // do not include '"'
while ( current != end )
{
Char c = *current++;
if ( c == '"' )
break;
else if ( c == '\\' )
{
if ( current == end )
return addError( "Empty escape sequence in string", token, current );
Char escape = *current++;
switch ( escape )
{
case '"': decoded += '"'; break;
case '/': decoded += '/'; break;
case '\\': decoded += '\\'; break;
case 'b': decoded += '\b'; break;
case 'f': decoded += '\f'; break;
case 'n': decoded += '\n'; break;
case 'r': decoded += '\r'; break;
case 't': decoded += '\t'; break;
case 'u':
{
unsigned int unicode;
if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )
return false;
decoded += codePointToUTF8(unicode);
}
break;
default:
return addError( "Bad escape sequence in string", token, current );
}
}
else
{
decoded += c;
if (c < 0 && current != end) //此处增加
decoded += *current++; //此处增加
}
}
return true;
}
bool
Reader::readString()
{
Char c = 0;
while ( current_ != end_ )
{
c = getNextChar();
if (c < 0) //增加
{ //增加
if(current_ != end_) getNextChar();//增加
continue; //增加
}//增加
if ( c == '\\' )
getNextChar();
else if ( c == '"' )
break;
}
return c == '"';
}