2011-01-06 24 views
5

Ho un elenco di unicode char "codici" che mi piacerebbe stampare utilizzando \u sequenza di escape (ad esempio \ue415), non appena provo a comporre con qualcosa di simile:Composizione formato char unicode per NSString

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

il compilatore mi avvisa del codice di carattere incompleto. Qualcuno può aiutarmi con questo compito banale?

+0

Si desidera emette un simbolo unicode con un determinato codice? – Vladimir

+0

Sì e ho già provato il segnaposto '% C' senza fortuna. – Eimantas

risposta

14

penso che non si può fare che il modo in cui si sta cercando - \ Uxxx sfuggire sequenza viene utilizzato per indicare che una costante è un carattere Unicode - e che la conversione viene elaborata al momento della compilazione.

Quello che vi serve è quello di convertire il vostro charCode ad un numero intero e utilizzare tale valore come parametro format:

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

Siamo spiacenti, non nust essere il modo migliore per ottenere il valore int dalla rappresentazione HEX, ma questo è il primo che è venuto in mente

Edit: sembra che NSScanner classe può eseguire la scansione NSString per numero in rappresentazione esadecimale:

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

che ha davvero fatto il trucco! Grazie! – Eimantas

+0

Questo è stato di grande aiuto! L'unica cosa è che ottengo un avviso sulla seconda riga poiché apparentemente unichar non è un tipo valido per l'argomento che passa della funzione scanHexInt :. Funziona ancora, ma è un avvertimento fastidioso. – Zebs

+0

È necessario utilizzare un po 'di manipolazione dei byte per far funzionare questo approccio NSScanner per valori unicode superiori> UFFFF ... vedi http://stackoverflow.com/a/15133359/2308190 –

1

Attenzione che non tutti i caratteri possono essere codificati in UTF-8. Ho avuto un bug ieri in cui alcuni caratteri coreani non venivano codificati correttamente in UTF-8.

La mia soluzione era di cambiare la stringa di formato da% s a% @ ed evitare il problema di ricodifica, anche se questo potrebbe non funzionare per voi.

+0

Vero, ma qui utf-8 è usato solo per convertire la rappresentazione della stringa del codice carattere nel suo valore intero, la stringa risultante può richiedere di essere trattata come stringa unicode – Vladimir

+0

Il problema che stavo eseguendo era la cattiva codifica UTF-8 conteneva caratteri null incorporati, quindi strtol non ti darà quello che stanno aspettando. – Mark

+0

Volevo visualizzare nuovamente i personaggi delle emoji da questo URL: http://pukupi.com/post/1964/ e il codice di Vladimir ha funzionato. Quindi immagino di essere fuori dallo scopo di questo problema. Grazie per la tua indicazione, comunque! – Eimantas

0

Sulla base di codici di @Vladimir, questo funziona per me:

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

che non conduce da "\ u" o "\\ u", da 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.