PerlObjCBridge从字符串读取plist的更好方法(由于NSStringEncoding值0x0000编码错误导致错误)?

时间:2012-01-10 17:02:23

标签: objective-c perl scripting nsstring nsstringencoding

此代码段是一个适用于任何Mac OS X系统的示例。

   #!/usr/bin/perl
use Foundation;
my $dscl = "/usr/bin/dscl";

sub getGeneratedUID(){
  my $name = shift;
  my $command = "$dscl -plist . -read /Users/$name GeneratedUID";
  print "$command\n";
  my $output = `$command`;
  my $plist = NSString->alloc()->initWithCString_encoding_($output,NSStringEncodingASCII);
  my $data = $plist->dataUsingEncoding_(NSStringEncodingASCII);
  my $record = NSPropertyListSerialization->propertyListWithData_options_format_error_($data,NSPropertyListImmutable,0,0);
  my $array = $record->objectForKey_('dsAttrTypeStandard:GeneratedUID');
  return $array->objectAtIndex_(0)->description()->UTF8String();
}
my $logname = $ENV{'LOGNAME'};
my $guid = &getGeneratedUID($logname);
print "My GUID: $guid\n";

所以我正在为Mac OS X目录服务命令行(dscl)实用程序编写一个perl包装器。它必须是perl,因为站点要求,并且由于这个命令多年来略微改变了它的输出,我使用它的能力将其输出格式化为Apple PROPERly列表。我多年来在其他几种语言中使用了NSPropertyListSerialization-> propertyListWithData,一般的想法是,如果你将字符串转换为数据,这将从字符串中为你创建一个NSDictionary,因此问题的标题就是更好的解析plist输出的方法。到目前为止,这段代码有效,但确实会出现以下错误:

2012-01-10 10:57:31.270 perl5.12[1876:1507] Incorrect NSStringEncoding value 0x0000 detected. Assuming NSASCIIStringEncoding. Will stop this compatiblity mapping behavior in the near future.

我认识到哪个谷歌搜索是这一行

  my $plist = NSString->alloc()->initWithCString_encoding_($output,NSStringEncodingASCII);

所以,如果我能找出编码错误,那么我认为这种方式对我来说非常好,但是如果你有更好的解析这个信息的建议,我很乐意听到它。但是我真的想弄清楚我应该使用什么编码或方法来桥接这两个字符串,我希望这是一个简单的问题,因为我找到了类似的问题,但没有任何处理使用桥接器的这种错误。

到目前为止,我已尝试删除alloc:

  my $plist = NSString->stringWithCString_($output);

我意识到这个错误并不是致命错误,但在我弄明白之前,我宁愿不使用这个方法。

1 个答案:

答案 0 :(得分:0)

它是NSASCIIStringEncoding,而不是NSStringEncodingASCII