1

このコード スニペットは、どの 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);

したがって、エンコーディング エラーを把握できれば、この方法でうまくいくと思いますが、この情報を解析するためのより良い提案があれば、ぜひ聞いてみたいと思います。ただし、2つの文字列をブリッジするためにどのエンコーディングまたはメソッドを使用する必要があるかを本当に理解したいと思います。これは、同様の質問を見つけたので簡単な質問ですが、ブリッジを使用してこの種のエラーを処理するものは何もありません。

これまでのところ、割り当てを削除しようとしました:

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

このエラーは致命的なものではないことはわかっていますが、それがわかるまではこの方法論を使用したくありません。

4

1 に答える 1

0

NSASCIIStringEncodingはありませんNSStringEncodingASCII

于 2012-01-10T21:46:46.613 に答える