我正在用C ++中的JSON文件读取一个字符串,当字符串中间出现一个特殊字符,如'ç'或'á'时,它将字符转换为'\ u00e7'和'\ u00e1'
这个词我正在阅读它的“Praça”,当我从JSON文件中读到时,变成了“Pra \ u00e7a”。 特殊字符“ç”它变成了“\ u00e7”。我想知道如何解析“Praça”。
答案 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;
}