NSString和UTF8十六进制转换

时间:2010-08-23 15:40:23

标签: cocoa utf-8 nsstring nsarray

在这个函数中,我从连接到名为emotes的IBOutlet的NSArrayController中获取NSTableView中的选定表情符号。所选NSArray中的字符串包含发送到剪贴板的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字符?谢谢。

2 个答案:

答案 0 :(得分: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] \(╹ヮ╹ )/

答案 1 :(得分: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")告诉数组加入字符串,并将该字符串放在字符串类型下的粘贴板上,以便轻松粘贴到文本编辑器和文本字段中。