Codificación incorrecta NSLog

Tengo un problema con el siguiente código:

NSString *strValue=@"你好"; char temp[200]; strcpy(temp, [strValue UTF8String]); printf("%s", temp); NSLog(@"%s", temp); 

en la primera línea de los códigos, dos caracteres chinos son comillas dobles. El problema es que la función printf puede mostrar los caracteres chinos correctamente, pero NSLog no puede.


Gracias a todos. Descubrí una solución para este problema. Foundation usa UTF-16 por defecto, así que para usar NSLog para generar la cadena c en el ejemplo, tengo que usar cStringUsingEncoding para obtener UTF-16 c string y usar% S para reemplazar% s.

 NSString *strValue=@"你好"; char temp[200]; strcpy(temp, [strValue UTF8String]); printf("%s", temp); strcpy(temp, [strValue cStringUsingEncoding:NSUTF16LittleEndianStringEncoding]); NSLog(@"%S", temp); 

El especificador de formato% s de NSLog está en la encoding del sistema, que parece ser siempre MacRoman y no unicode, por lo que solo puede mostrar caracteres en la encoding de MacRoman. La mejor opción con NSLog es utilizar el especificador de formato de objeto nativo% @ y pasar el NSString directamente en lugar de convertirlo en una cadena C. Si solo tiene una cadena C y desea usar NSLog para mostrar un mensaje en lugar de printf o asl, deberá hacer algo como Don sugiere para convertir primero la cadena a un objeto NSString.

Entonces, todos estos deberían mostrar la cadena esperada:

 NSString *str = @"你好"; const char *cstr = [str UTF8String]; NSLog(@"%@", str); printf("%s\n", cstr); NSLog(@"%@", [NSString stringWithUTF8String:cstr]); 

Si decide utilizar asl, tenga en cuenta que, aunque acepta cadenas en formato UTF8 y pasa la encoding correcta al daemon syslog (para que se muestre correctamente en la consola), codifica la cadena para la encoding visual cuando se visualiza en la terminal o iniciando sesión en un identificador de archivo, para que los valores que no sean ASCII se muestren como secuencias de caracteres escapadas.

Mi suposición es que NSLog supone una encoding diferente para C-series de 8 bits que UTF-8, y puede ser una que no admita caracteres chinos. Torpe como es, puedes intentar esto:

 NSLog(@"%@", [NSString stringWithCString: temp encoding: NSUTF8StringEncoding]); 

Sé que probablemente estés buscando una respuesta que te ayude a entender lo que está pasando.

Pero esto es lo que podrías hacer para resolver tu problema ahora mismo:

 NSLog(@"%@", strValue); 
  # define NSLogUTF8(a,b) NSLog(a,[NSString stringWithCString:[[NSString stringWithFormat:@"%@",b] cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding]) #define NSLogUTF8Ex(a,b) NSLog(a,[MLTool utf8toNString:[NSString stringWithFormat:@"%@",b]]) +(NSString*)utf8toNString:(NSString*)str{ NSString* strT= [str stringByReplacingOccurrencesOfString:@"\\U" withString:@"\\u"]; //NSString *strT = [strTemp mutableCopy]; CFStringRef transform = CFSTR("Any-Hex/Java"); CFStringTransform((__bridge CFMutableStringRef)strT, NULL, transform, YES); return strT; }