2010-08-23 71 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