2009-04-06 13 views
12

J'ai un problème avec le code suivant:NSLog incorrect encodage

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

dans la première ligne des codes, deux caractères chinois sont entre guillemets doubles. Le problème est la fonction printf peut afficher les caractères chinois correctement, mais NSLog ne peut pas.


Merci à tous. J'ai trouvé une solution à ce problème. Foundation utilise par défaut UTF-16, donc pour utiliser NSLog pour sortir la chaîne c dans l'exemple, je dois utiliser cStringUsingEncoding pour obtenir la chaîne UTF-16 c et utiliser% S pour remplacer% s.

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

Répondre

2

Je sais que vous êtes probablement à la recherche d'une réponse qui vous aidera à comprendre ce qui se passe.

Mais c'est ce que vous pourriez faire pour résoudre votre problème en ce moment:

NSLog(@"%@", strValue); 
4

Je pense que NSLog suppose un codage différent pour C-chaînes 8 bits que UTF-8, et il peut être celui qui ne supporte pas les caractères chinois. Maladroit comme il est, vous pouvez essayer ceci:

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

spécificateur de format de% NSLog est dans le codage du système, qui semble être toujours MacRoman et non unicode, donc il ne peut les caractères d'affichage dans le codage MacRoman. Votre meilleure option avec NSLog consiste simplement à utiliser le spécificateur de format d'objet natif% @ et à passer directement la chaîne NSS au lieu de la convertir en chaîne C. Si vous avez seulement une chaîne C et que vous voulez utiliser NSLog pour afficher un message au lieu de printf ou asl, vous devrez faire quelque chose comme Don suggère afin de convertir la chaîne en un objet NSString en premier.

Ainsi, tous ceux-ci devraient afficher la chaîne attendue:

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

Si vous décidez d'utiliser asl, notez que si elle accepte des chaînes au format UTF8 et passe le codage correct au démon syslog (donc il s'affichera correctement dans la console), il encode la chaîne pour l'encodage visuel lors de l'affichage sur le terminal ou de la connexion à un descripteur de fichier, de sorte que les valeurs non-ASCII seront affichées comme des séquences de caractères échappées.

-1
# 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; 
} 
+0

Bonne approche :-) cela fonctionnera-t-il avec les blancs entre '#' et 'define'? Aussi, peut-être qu'une ligne d'explication peut être utile, car la ligne de code est très longue et donc pas lisible. –

+0

@peter_the_oak Travail parfait pour moi – Gank