2010-03-31 16 views
6

Wenn ich speichere eine NSString innerhalb einiger NSDictionary und dass Wörterbuch wie diese an die Konsole anmelden:Wie kann ich Unicode-Zeichen in einem NSString entkommen lassen?

NSString *someString = @"Münster"; 
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ]; 
NSLog (@"someDict: %@", [ someDict description ]); 

Die Konsolenausgabe wie folgt aussieht:

unicode_test[3621:903] someDict: 
{ 
    thestring = "M\U00fcnster"; 
} 

mit der Unicode-Zeichen der Zeichenfolge entkommen. Gibt es eine Methode, um einen NSString in diese Escape-Repräsentation zu konvertieren?

Antwort

6

Das Problem könnte mit einer Schleife in einer UniChar-String-Darstellung der angegebenen Zeichenfolge gelöst werden. Implementiert als Erweiterung auf NSString es in etwa so aussehen würde:

- (NSString *) escapedUnicode 
{ 
    NSMutableString *uniString = [ [ NSMutableString alloc ] init ]; 
    UniChar *uniBuffer = (UniChar *) malloc (sizeof(UniChar) * [ self length ]); 
    CFRange stringRange = CFRangeMake (0, [ self length ]); 

    CFStringGetCharacters ((CFStringRef)self, stringRange, uniBuffer); 

    for (int i = 0; i < [ self length ]; i++) { 
     if (uniBuffer[i] > 0x7e) 
      [ uniString appendFormat: @"\\u%04x", uniBuffer[i] ]; 
     else 
      [ uniString appendFormat: @"%c", uniBuffer[i] ]; 
    } 

    free (uniBuffer); 

    NSString *retString = [ NSString stringWithString: uniString ]; 
    [ uniString release ]; 

    return retString; 
} 
+0

Sollte nicht der Test, ob oder nicht, um zu bestimmen Unicode-entkommen das Zeichen sein „if (uniBuffer [i]> 0x7f)“? In der UTF-8-Kodierung (zumindest), obwohl 0x7f nicht druckt, ist es ein gültiges Ein-Byte-Zeichen. – erikprice

1
NSDictionary *someDict = [ NSDictionary dictionaryWithObjectsAndKeys: 
    someString, @"thestring" ]; 

Sie das nil Sentinel nicht vergessen. ;)

Die Konsolenausgabe sieht wie folgt aus:

unicode_test[3621:903] someDict: 
{ 
    thestring = "M\U00fcnster"; 
} 

mit dem Unicode-Zeichen der Zeichenfolge entkommen.

Sie sind alle Unicode-Zeichen.

Gibt es eine Methode, um einen NSString in diese Escape-Darstellung zu konvertieren?

Das ist das Wörterbuch (oder eine private Methode von NSPropertyListSerialization oder private Funktion von CFPropertyList), die das tun, nicht die Zeichenfolge. Die \ U-Sequenz in dieser Ausgabe ist Teil des OpenStep plist-Formats. Wenn Sie das plist als XML mit NSPropertyListSerialization ausgeben, werden Sie das (derzeit) als nackte UTF-8 kodieren.

Soweit ich weiß, gibt es keine integrierte Methode, öffentliche oder private, die das gleiche für Sie auf einer Zeichenfolge allein entkommen wird. Die nächste Sache ist die strvis Funktion, aber das funktioniert byteweise; Es versteht nicht Unicode oder UTFs.

Verwandte Themen