2011-01-06 9 views
5

Ich habe eine Liste von Unicode-Zeichen „Codes“, die Ich mag würde mit \u Escape-Sequenz (zB \ue415), sobald ich es mit so etwas zu komponieren versuchen zu drucken:Composing Unicode-Zeichen-Format für NSString

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

der Compiler warnt mich vor unvollständigen Zeichencode. Kann mir jemand bei dieser trivialen Aufgabe helfen?

+0

Sie wollen Unicode-Symbol mit gegebenem Code ausgeben? – Vladimir

+0

Ja und ich habe bereits den '% C' Platzhalter ohne Glück versucht. – Eimantas

Antwort

14

Ich denke, Sie können das nicht so machen, wie Sie es versuchen - \ uxxx Escape-Sequenz wird verwendet, um anzuzeigen, dass eine Konstante ein Unicode-Zeichen ist - und diese Konvertierung wird zur Kompilierzeit verarbeitet.

Was Sie brauchen, ist Ihr charCode auf eine ganze Zahl zu konvertieren und diesen Wert als Formatparameter verwenden:

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

Sorry, das nust nicht der beste Weg, um int Wert von HEX Darstellung zu bekommen, aber das ist die erste, die

Bearbeiten in den Sinn kam: Es scheint, dass NSScanner Klasse NSString für Nummer in hex Darstellung scannen:

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

das hat wirklich den Trick gemacht! Vielen Dank! – Eimantas

+0

Das war eine große Hilfe! Die einzige Sache ist, dass ich eine Warnung in der zweiten Zeile bekomme, da anscheinend unichar kein gültiger Typ für das Passing-Argument der scanHexInt: -Funktion ist. Es funktioniert immer noch, ist aber eine nervige Warnung. – Zebs

+0

Sie müssen ein bisschen Byte-Manipulation verwenden, um diesen NSScanner-Ansatz für höhere Unicode-Werte zu verwenden> UFFFF ... siehe http://stackoverflow.com/a/15133359/2308190 –

1

Beachten Sie, dass nicht alle Zeichen in UTF-8 codiert werden können. Ich hatte gestern einen Fehler, bei dem einige koreanische Zeichen nicht richtig in UTF-8 codiert wurden.

Meine Lösung bestand darin, die Formatzeichenfolge von% s in% @ zu ändern und das Problem der erneuten Codierung zu vermeiden, obwohl dies für Sie möglicherweise nicht funktioniert.

+0

Richtig, aber hier wird utf-8 verwendet nur um Zeichenkettenrepräsentation von Zeichencode in einen ganzzahligen Wert zu konvertieren, muss die resultierende Zeichenkette selbst als Unicode-Zeichenkette behandelt werden. – Vladimir

+0

Das Problem, mit dem ich zu tun hatte, war die fehlerhafte UTF-8-Codierung, die Nullzeichen enthielt, also gibt strtol Ihnen nicht das, was Sie tun erwarten. – Mark

+0

Ich wollte Emoji-Zeichen von dieser URL wieder anzeigen: http://pukupi.com/post/1964/ und Vladimirs Code hat die Aufgabe erfüllt. Also ich denke, ich bin außerhalb des Rahmens dieses Problems. Danke für Ihre Eingabe! – Eimantas

0

Basierend auf Codes von @Vladimir, das für mich funktioniert:

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

nicht führt durch "\ u" oder "\\ u", von 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.