2011-01-06 3 views
5

J'ai une liste des « codes » unicode ombles que je voudrais imprimer à l'aide \u séquence d'échappement (par exemple \ue415), dès que j'essaie de composer avec quelque chose comme ceci:Composing le format unicode char pour NSString

Le compilateur me prévient du code de caractère incomplet
// charCode comes as NSString object from PList 
NSString *str = [NSString stringWithFormat:@"\u%@", charCode]; 

Quelqu'un peut-il m'aider avec cette tâche triviale?

+0

Vous voulez afficher un symbole Unicode avec un code donné? – Vladimir

+0

Oui et j'ai déjà essayé l'espace réservé '% C' sans chance. – Eimantas

Répondre

14

Je pense que vous ne pouvez pas faire cela comme vous essayez - la séquence d'échappement \ uxxx est utilisée pour indiquer qu'une constante est un caractère unicode - et cette conversion est traitée au moment de la compilation.

Qu'est-ce que vous avez besoin est de convertir votre charCode à un nombre entier et utiliser cette valeur comme paramètre de format:

unichar codeValue = (unichar) strtol([charCode UTF8String], NULL, 16); 
NSString *str = [NSString stringWithFormat:@"%C", charCode]; 
NSLog(@"Character with code \\u%@ is %C", charCode, codeValue); 

Désolé, que NUST ne pas être la meilleure façon d'obtenir une valeur int de la représentation HEX, mais c'est 1er qui est venu à l'esprit

Edit: Il semble que NSScanner classe peut analyser NSString pour le nombre dans la représentation hexagonale:

unichar codeValue; 
[[NSScanner scannerWithString:charCode] scanHexInt:&codeValue]; 
... 
+0

qui a vraiment fait l'affaire! Merci! – Eimantas

+0

C'était une aide précieuse! La seule chose est que j'obtiens un avertissement sur la deuxième ligne car apparemment unichar n'est pas un type valide pour l'argument passant de la fonction scanHexInt:. Cela fonctionne toujours, mais c'est un avertissement ennuyeux. – Zebs

+0

Vous devez utiliser un peu de manipulation d'octets pour que cette approche NSScanner fonctionne pour des valeurs unicode plus élevées> UFFFF ... voir http://stackoverflow.com/a/15133359/2308190 –

1

Attention, tous les caractères ne peuvent pas être encodés en UTF-8. J'ai eu un bug hier où certains caractères coréens ne pouvaient pas être encodés correctement en UTF-8.

Ma solution était de changer la chaîne de format de% s à% @ et d'éviter le problème de ré-encodage, bien que cela puisse ne pas fonctionner pour vous.

+0

Vrai, mais ici utf-8 est utilisé juste pour convertir la représentation de chaîne du code de caractère à sa valeur entière, la chaîne résultante elle-même peut être traitée comme chaîne unicode – Vladimir

+0

Le problème que je rencontrais était le mauvais encodage UTF-8 contenu des caractères null incorporés, donc strtol ne vous donnera pas ce que vous attendons. – Mark

+0

Je voulais réafficher les caractères emoji de cette url: http://pukupi.com/post/1964/ et le code de Vladimir a fait le travail. Donc je suppose que je suis hors de portée de ce problème. Merci tout de même pour ta contribution! – Eimantas

0

Sur la base des codes de @Vladimir, cela fonctionne pour moi:

NSUInteger codeValue; 
[[NSScanner scannerWithString:@"0xf8ff"] scanHexInt:&codeValue]; 
NSLog(@"%C", (unichar)codeValue); 

ne conduisant pas par "\ u" ou "\\ u", de l'API doc:

The hexadecimal integer representation may optionally be preceded 
by 0x or 0X. Skips past excess digits in the case of overflow, 
so the receiver’s position is past the entire hexadecimal representation.