如何将UTF-8中的字符串的一部分解析为C ++中的字符串?

时间:2014-09-25 17:10:22

标签: c++ c json parsing

我正在用C ++中的JSON文件读取一个字符串,当字符串中间出现一个特殊字符,如'ç'或'á'时,它将字符转换为'\ u00e7'和'\ u00e1'

这个词我正在阅读它的“Praça”,当我从JSON文件中读到时,变成了“Pra \ u00e7a”。 特殊字符“ç”它变成了“\ u00e7”。我想知道如何解析“Praça”。

1 个答案:

答案 0 :(得分:0)

你正确地解析它。当一个字符串被编码为utf-8,并且你读它时,你不想改变任何东西。字符串在内存中已经正确。

问题在于显示字符串的任何系统都不处理utf-8,并以C / C ++ / Java源代码编码显示它。

最好的办法是修复处理和显示字符串以处理utf-8的系统。如果你不能这样做并且仅限于使用ascii-那么你可以将一些unicode字符映射回ascii。但是你无法处理大多数角色(例如所有亚洲角色)。你基本上会回到一个前unicode世界。

如果这是你能做的最好的,那么这里是你的映射:

bool KxnUTF8Code::decode( const char* str )
{
assert( str );
clear();

bool ret = true;

const char* cstr = str;
int len = strlen( str );

while ( *cstr )
{
   char c = cstr[0];
   if ( c >= 0x80 )
   {
     // this is a high bit character - starts a unicode character. Try converting to ascii
     if ( c == 0xc2 )
     {
        // decode a utf character in the 0xC2 range. 
        c = cstr[1];
        if (( c >= 0x80 ) && ( c <= 0xBF ))
        {
           // Only characters from 0x80-0xBF range are valid ascii
           write( &c, 1 );

        } else {

           // not ascii - you're boned.
           c = '?';
           write( &c, 1 );
           ret = false;
        }

        cstr += 2;

     } else if ( c == 0xc3 ) {

        // decode a utf character in the 0xC3 range. 
        c = cstr[1];
        if (( c >= 0x80 ) && ( c <= 0xBF ))
        {
           // Only characters from 0x80-0xBF range are valid
           c += 0x40;
           write( &c, 1 );

        } else {

           // not ascii - screwed again...
           c = '?';
           write( &c, 1 );
           ret = false;
        }

        cstr += 2;

     } else {

        // none of the longer codes are ascii either... 
        int codeLen = 1;

             if (( c >= 194 ) && ( c <= 223 )) codeLen = 2;
        else if (( c >= 224 ) && ( c <= 239 )) codeLen = 3;
        else if (( c >= 240 ) && ( c <= 247 )) codeLen = 4; // not all of these are yet allocated.
        else if (( c >= 248 ) && ( c <= 251 )) codeLen = 5; // none of these are allocated
        else if (( c >= 252 ) && ( c <= 253 )) codeLen = 6; // none of these are allocated

        cstr += codeLen; 

        c = '?';
        write( &c, 1 );
        ret = false;
     }

  } else {

     // unmodified ascii character.
     write( &cstr[0], 1 );
     cstr++;
  }
}

return ret;
}