2009-07-22 12 views
5

Je veux faire un tableau de caractères Unicode, mais je ne sais pas comment convertir des entiers en une représentation Unicode. Voici le code que j'ai jusqu'à présentComment puis-je créer des caractères Unicode à partir d'entiers?

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0]; 
int i; 

for (i = 32; i < 300; i++) { 
    NSString *uniString = [NSString stringWithFormat:@"\u%04X", i]; 
    [uniArray addObject:uniString]; 
} 

Ce qui me donne une erreur « nom de caractère universel incomplet \ u »

Y at-il une meilleure façon de construire un tableau de symboles Unicode? Merci.

Répondre

7

Vous devez utiliser% C pour insérer un caractère unicode:

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0]; 
int i; 

for (i = 32; i < 300; i++) { 
    NSString *uniString = [NSString stringWithFormat:@"%C", i]; 
    [uniArray addObject:uniString]; 
} 

Une autre (? Meilleure) est l'utilisation stringWithCharacters:

NSMutableArray *uniArray = [[NSMutableArray alloc] initWithCapacity:0]; 
int i; 

for (i = 32; i < 300; i++) { 
    NSString *uniString = [NSString stringWithCharacters:(unichar *)&i length:1]; 
    [uniArray addObject:uniString]; 
} 
+0

Très bien, merci pour cela. J'ai utilisé le premier, c'était juste ce dont j'avais besoin. –

+0

La principale différence est que '% C' prend un' wchar_t', qui est (actuellement, et sur Mac OS X) 32 bits, donc vous y passez UTF-32. 'stringWithCharacters:' prend UTF-16. –

1

Si vous voulez un jeu de caractères UTF-16, [NSString stringWithCharacters:&character length:1] . Si c'est UTF-32, vous devrez convertir en paires de substitution, ou utiliser -initWithData:encoding:, ou essayez ce que Philippe a dit (je ne suis pas sûr que ce soit UTF-32 de cette poignée correctement, mais il devrait).

2

La raison de l'erreur est que \u doit être suivi de quatre chiffres hexadécimaux au moment de la compilation. Vous l'avez suivi avec "%04x", apparemment avec l'intention d'insérer ces quatre chiffres hexadécimaux au moment de l'exécution, ce qui est trop tard - le compilateur a depuis longtemps terminé son travail d'ici là, et le compilateur est ce qui vous donne cette erreur.

0

Encore un autre exemple flagrant de Regex Utilisation:

RegexKitLite requis. Utilise l'expression regex (?s). pour diviser une chaîne de caractères unicode en NSArray. L'opérateur . regex correspond à tout mais caractères de nouvelle ligne par défaut, et la séquence (?s) indique Turn on the Dot All regex option, ce qui permet . de faire correspondre le caractère de nouvelle ligne. Important puisque nous passons évidemment au moins \n dans l'exemple ci-dessous.

#import <Foundation/Foundation.h> 
#import "RegexKitLite.h" 

// Compile with: gcc -std=gnu99 -o unicodeArray unicodeArray.m RegexKitLite.m -framework Foundation -licucore 

int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    unichar uc[1024]; 
    for(NSUInteger idx = 0UL; idx < 1024UL; idx++) { uc[idx] = (unichar)idx; } 
    NSArray *unicharArray = [[NSString stringWithCharacters:uc length:1024UL] componentsMatchedByRegex:@"(?s)."]; 

    NSLog(@"array: %@", [unicharArray subarrayWithRange:NSMakeRange(32UL, (1024UL - 32UL))]); 

    [pool release]; 
    return(0); 
} 
Questions connexes