2010-03-31 98 views
6

當我存儲一些的NSDictionary內的NSString和日誌字典這樣的控制檯:如何在NSString中轉義unicode字符?

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

控制檯輸出看起來是這樣的:

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

以字符串的Unicode字符轉義。 是否有任何方法將NSString轉換爲此轉義表示?

回答

6

該問題可以通過使用給定字符串的UniChar字符串表示形式的循環來解決。實現擴展上的NSString它會是這個樣子:

- (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

不應該的測試,以確定是否爲Unicode轉義「如果(uniBuffer [I]> 0x7f)中的」字呢?在UTF-8編碼(至少)中,即使0x7f不是打印,它也是一個有效的單字節字符。 – erikprice 2011-10-25 19:01:45

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

不要忘了nil前哨。 ;)

控制檯輸出看起來是這樣的:

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

以字符串的Unicode字符轉義。

它們是全部 Unicode字符。

是否有任何方法將NSString轉換爲此轉義表示?

這就是字典(或NSPropertyListSerialization的一些私有方法或CFPropertyList的私有函數),而不是字符串。該輸出中的\ U序列是OpenStep plist格式的一部分。如果使用NSPropertyListSerialization將plist作爲XML輸出,則會發現ü(當前)編碼爲裸UTF-8。

據我所知,沒有內置的方法,公共或私人,將只爲你一個字符串逃脫。最接近的是strvis函數,但它的工作原理是逐字節的;它不理解Unicode或UTF。

相關問題