2011-01-06 17 views
5

que tienen una lista de carbón Unicode "códigos" que me gustaría imprimir utilizando \u secuencia de escape (por ejemplo \ue415), tan pronto como trato de componer con algo como esto:formato Unicode para carbón NSString

// charCode comes as NSString object from PList 
NSString *str = [NSString stringWithFormat:@"\u%@", charCode]; 

el compilador me advierte sobre el código de carácter incompleto. ¿Alguien puede ayudarme con esta tarea trivial?

+0

Usted quiere salida símbolo unicode con el código dado? – Vladimir

+0

Sí y ya he probado el marcador de posición '% C' sin suerte. – Eimantas

Respuesta

14

Creo que no puede hacer eso de la manera en que lo intenta - la secuencia de escape \ uxxx se usa para indicar que una constante es un carácter unicode y esa conversión se procesa en tiempo de compilación.

Lo que necesita es convertir su charCode a un número entero y utilizar este valor como parámetro de formato:

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

Lo sentimos, no Nust ser la mejor manera de conseguir int valor de la representación HEX, pero eso es el primero que vino a la mente

Editar: parece que NSScanner clase puede escanear NSString de número en representación hexadecimal:

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

que realmente funcionó! ¡Gracias! – Eimantas

+0

¡Esto fue de gran ayuda! Lo único es que recibo una advertencia en la segunda línea porque aparentemente unichar no es un tipo válido para el argumento de paso de la función scanHexInt :. Todavía funciona, pero es una advertencia molesta. – Zebs

+0

Necesita utilizar un poco de manipulación de bytes para hacer que este enfoque de NSScanner funcione para valores unicode más altos> UFFFF ... vea http://stackoverflow.com/a/15133359/2308190 –

1

Tenga en cuenta que no todos los caracteres pueden codificarse en UTF-8. Ayer tuve un error en el que algunos caracteres coreanos no se codificaban correctamente en UTF-8.

Mi solución fue cambiar la cadena de formato de% s a% @ y evitar el problema de recodificación, aunque puede que esto no funcione para usted.

+0

Cierto, pero aquí se usa utf-8 solo para convertir la representación de cadenas del código de caracteres a su valor entero, la cadena resultante puede requerir ser tratada como cadena unicode – Vladimir

+0

El problema con el que me estaba encontrando era la codificación UTF-8 mal contenía caracteres nulos incrustados, por lo que strtol no te dará lo que están esperando. – Mark

+0

Quería volver a mostrar los caracteres emoji de esta url: http://pukupi.com/post/1964/ y el código de Vladimir hizo el trabajo. Así que supongo que estoy fuera del alcance de este problema. ¡Gracias por tu aporte! – Eimantas

0

Sobre la base de los códigos de @Vladimir, esto funciona para mí:

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

no conduce por "\ u" o "\\ U", a partir de la 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. 
Cuestiones relacionadas