这段代码是一个应该可以在任何Mac系统上运行的示例。
#!/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目录服务命令行(dscl)实用程序编写一个perl包装器。由于站点的要求,它必须是perl,并且由于这个命令多年来略微改变了它的输出,所以我使用它的功能将其输出格式化为Apple适当的列表。多年来,我在其他几种语言中使用过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);因此,如果我能找出编码错误,那么我认为这种方式对我来说工作得很好,但如果你有更好的建议来解析这个信息,我很乐意听到它。然而,我真的很想弄清楚我应该使用什么编码或方法来桥接这两个字符串,我希望这是一个简单的问题,因为我发现了类似的问题,但没有使用桥来处理这种错误。
到目前为止,我已经尝试删除分配:
my $plist = NSString->stringWithCString_($output);我意识到这个错误不是致命的,但我宁愿在找出它之前不要使用这个方法。
发布于 2012-01-11 05:46:47
是NSASCIIStringEncoding,不是NSStringEncodingASCII。
https://stackoverflow.com/questions/8807276
复制相似问题