2010-08-23 78 views
0

在這個函數中,我從NSTableView的NSArrayController中獲取選定的表情符號,連接到一個名爲emotes的IBOutlet。所選NSArray中的字符串包含發送到剪貼板的UTF8字符。NSString和UTF8十六進制轉換

// Get Selected Emoticon 
NSArray * selectedemote = [emotes selectedObjects]; 
NSLog(@"%@",[selectedemote valueForKey:@"emote"]); 
// Send to Clipboard 
[self copyToClipboard:[NSString stringWithFormat:@"%@",[selectedemote valueForKey:@"emote"]]]; 

問題出在NSArray本身。它似乎將UTF8字符串輸出爲十六進制。這裏是字符串看起來像從NSLog的功能是什麼:

2010-08-23 11:23:56.411 Emoticon[7919:a0f] (
    "\\(\U2579\U30ee\U2579)/" 
) 

是那裏的UTF-8十六進制轉換爲UTF-8字符的可能呢?謝謝。

+1

一個字符串不包含UTF-8什麼。 UTF-8是一種編碼;您使用編碼從字符串中產生數據(或從數據中解碼字符串)。因此,您可以使用UTF-8數據或UTF-16數據編碼字符串的字符,但該字符串只包含字符。 – 2010-08-23 15:53:34

回答

1

我解決了這個問題。解決方案是使用NSEntityDescription,並使用所選單元格的NSArray中的objectAtIndex:0進行初始化。使用NSEntityDescription,我獲得了Emote的價值。

-(IBAction)sendtoclipboard:(id)sender 
{ 
    // Get Selected Emoticon 
    NSArray * selectedemote = [emotes selectedObjects]; 
    NSEntityDescription *entity = [selectedemote objectAtIndex:0]; 
    NSString * tmpemote = [NSString stringWithFormat:@"%@",[entity valueForKey:@"emote"]]; 
    NSLog(@"%@", [entity valueForKey:@"emote"]); 
    //Send to Clipboard 
    [self copyToClipboard:tmpemote]; 
} 

結果:

2010-09-07 20:03:26.488 Emoticon[45764:a0f] \(╹ヮ╹)/ 
0

問題出在NSArray本身。它似乎將UTF8字符串輸出爲十六進制。

正如我在我的評論中指出的,該字符串不是UTF-8。字符串與編碼無關,除非通過數據創建字符串或從中創建數據。

這裏是字符串的樣子從NSLog的功能:

2010-08-23 11:23:56.411 Emoticon[7919:a0f] (
    "\\(\U2579\U30ee\U2579)/" 
) 

的NSArray通過返回舊風格的屬性列表格式的字符串描述自己。該格式必須是ASCII,所以該數組使用那些\U序列轉義字符串的非ASCII字符。這是按照它應該的方式工作的,並且它是特定於陣列的描述。字符串保持不變,您會看到是否直接記錄字符串。如果你想把數組放在剪貼板上,就這樣做。您應該創建一個統一的類型標識符(yourdomain.yourappname.typename),並告訴粘貼板將數組設置爲該類型的屬性列表值。您還可以讓陣列使用某個分隔符(例如@"\n")加入字符串,並將該字符串放在字符串類型下的粘貼板上,以便輕鬆粘貼到文本編輯器和文本字段中。

+0

這解釋了這個問題,但仍然不是解決問題的解決方案。我會盡力弄明白自己。 – chikorita157 2010-08-31 20:42:35

+0

chikorita157:不,它解釋說沒有問題。字符串不會像數組顯示的那樣轉義;該陣列只在其自身的描述中進行轉義。正如我所說的,不是記錄數組,而是直接記錄字符串。然後你會看到字符串的真實內容。 – 2010-08-31 20:47:38