2009-07-22 20 views
5

Voglio creare una matrice di caratteri Unicode, ma non so come convertire gli interi in una rappresentazione Unicode. Ecco il codice che ho finoraCome posso creare caratteri unicode da numeri interi?

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

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

Il che mi dà un errore "incompleto universale nome del personaggio \ u"

Esiste un modo migliore per costruire una serie di simboli Unicode? Grazie.

risposta

7

Si dovrebbe usare% C per inserire un carattere Unicode:

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

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

Un altro modo (? Migliore) sta usando 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

Grande, grazie per questi. Ho usato il primo, era proprio quello di cui avevo bisogno. –

+0

La differenza principale è che '% C' prende un' wchar_t', che è (attualmente e su Mac OS X) a 32 bit, quindi stai passando UTF-32 lì. 'stringWithCharacters:' richiede UTF-16. –

1

Se si desidera un singolo carattere UTF-16, [NSString stringWithCharacters:&character length:1] . Se è UTF-32, dovresti convertire in coppie sostitutive, o usare -initWithData:encoding:, o provare ciò che Philippe ha detto (non sono sicuro che sia utile se UTF-32 di questo handle è corretto, ma dovrebbe).

2

Il motivo dell'errore è che \u deve essere seguito da quattro cifre esadecimali in fase di compilazione. Lo hai seguito con "%04x", apparentemente con l'intento di inserire quelle quattro cifre esadecimali in fase di esecuzione, che è troppo tardi - il compilatore ha già da tempo terminato il suo lavoro, e il compilatore è quello che ti sta dando questo errore

0

ancora un altro esempio egregio di Regex utilizzati:

Richiede RegexKitLite. Utilizza la regex (?s). per dividere una stringa di caratteri Unicode in un NSArray. L'operatore regex . corrisponde a tutto ma caratteri di nuova riga per impostazione predefinita e la sequenza (?s) dice Turn on the Dot All regex option che consente a . di corrispondere anche al carattere di nuova riga. Importante dato che ovviamente passiamo almeno allo \n nell'esempio qui sotto.

#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); 
} 
Problemi correlati