2009-07-22 19 views
5

Quiero hacer una matriz de caracteres Unicode, pero no sé cómo convertir enteros en una representación Unicode. Aquí está el código que tengo hasta ahora¿Cómo puedo hacer caracteres Unicode a partir de enteros?

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

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

Lo que me da un error "incompleta universal, el nombre del personaje \ u"

¿Hay una mejor manera de construir una serie de símbolos Unicode? Gracias.

Respuesta

7

Debe utilizar% C para insertar un carácter Unicode:

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

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

Otra forma (? Mejor) es el uso de 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

Genial, gracias por esto. Usé el primero, era justo lo que necesitaba. –

+0

La principal diferencia es que '% C' toma' wchar_t', que es (actualmente, y en Mac OS X) de 32 bits, por lo que está pasando UTF-32 allí. 'stringWithCharacters:' toma UTF-16. –

1

Si quieres un solo carácter UTF-16, [NSString stringWithCharacters:&character length:1] . Si es UTF-32, tendrías que convertir a pares sustitutos, o usar -initWithData:encoding:, o probar lo que dijo Philippe (no estoy seguro si ese UTF-32 es adecuado, pero debería).

2

El motivo del error es que \u debe ir seguido de cuatro dígitos hexadecimales en tiempo de compilación. Lo ha seguido con "%04x", aparentemente con la intención de insertar esos cuatro dígitos hexadecimales en el tiempo de ejecución, que es demasiado tarde; el compilador ya ha terminado su trabajo hace mucho tiempo, y el compilador es lo que le está dando este error.

0

otro ejemplo atroz de Regex Uso:

Requiere RegexKitLite. Utiliza la expresión regular (?s). para dividir una cadena de caracteres Unicode en un NSArray. El operador de expresiones regulares . coincide con todo pero caracteres de nueva línea de forma predeterminada, y la secuencia (?s) dice Turn on the Dot All regex option que permite que . coincida también con el carácter de nueva línea. Importante ya que obviamente pasamos al menos \n en el ejemplo a continuación.

#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); 
} 
Cuestiones relacionadas