PerlObjCBridge Лучший способ прочитать список из строки (из-за неправильной ошибки кодирования NSStringEncoding 0x0000) - PullRequest
1 голос
/ 10 января 2012

Этот фрагмент кода является примером, который должен работать в любой системе 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";

Итак, я пишу оболочку perl для утилиты командной строки службы каталогов Mac OS X (dscl). Это должно быть perl из-за требований сайта, а также из-за того, что эта команда несколько изменила свои выходные данные за эти годы, и я использую возможность для нее форматировать свои выходные данные в виде списка Apple Propertly. Я использовал 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 голосов
/ 11 января 2012

Это NSASCIIStringEncoding, а не NSStringEncodingASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...