Установить строку-терминатор строки в NSDocument? - PullRequest
1 голос
/ 17 декабря 2010

(Этот вопрос был переписан из проблемы с NSTextView после некоторых дальнейших исследований)

ОБНОВЛЕНИЕ: Вы можете скачать очень простой проект, который отображает проблему здесь:

http://w3style.co.uk/~d11wtq/DocumentApp.tar.gz

(Сделайте grep -c "\r" file.txt в файле, который вы сохраняете, чтобы получить счетчик строк, где происходит \r ... повторите для \n).

Я понял, все файлысозданный NSDocument имеет \r это окончания строк, а не стандартное \n, даже если NSData возврат моего подкласса документа не содержит \r, он содержит только \n.Есть ли способ настроить это?

Я думал, что в эти дни Mac использовали концевые строки UNIX, поэтому кажется странным, что AppKit все еще использует устаревшие окончания Mac.Более странным является то, что NSDocument запрашивает NSData, а затем довольно недоброжелательно искажает это NSData путем преобразования концов строк.

Переключение на \r происходит после , производящего NSData, поэтому NSDocument сам выполняет некоторые замены в байтах:

 const char *bytes = [data bytes];
 int i, len;
 for (i = 0, len = [data length]; i < len; ++i) {
  NSLog(@"byte %d = %02x", i, bytes[i]);
 }

Выходы (примечание 0a - шестнадцатеричное значение \n):

> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 0 = 66
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 1 = 6f
> 2010-12-17 12:45:59.076
> MojiBaker[74929:a0f] byte 2 = 6f
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 3 = 0a
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 4 = 62
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 5 = 61
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 6 = 72
> 2010-12-17 12:45:59.077
> MojiBaker[74929:a0f] byte 7 = 0a

Если NSDocument собирается запросить NSData, тогда он должен уважать это и не изменять его.

Вот полный код метода: -dataOfType:error: метод в моем документе:

    -(NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError {
 NSString *string = [textView string];

 // DEBUG CODE...
 NSArray *unixLines = [string componentsSeparatedByString:@"\n"];
 NSArray *windowsLines = [string componentsSeparatedByString:@"\r\n"];
 NSArray *macLines = [string componentsSeparatedByString:@"\r"];

 NSLog(@"TextView has %d LF, %d CRLF, %d CR", [unixLines count] - 1, [windowsLines count] - 1, [macLines count] - 1);

 NSData *data = [NSData dataWithBytes:[string cStringUsingEncoding:NSUTF8StringEncoding]
          length:[string lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];

 const char *bytes = [data bytes];
 int i, len;
 for (i = 0, len = [data length]; i < len; ++i) {
  NSLog(@"byte %d = %02x", i, bytes[i]);
 }

 if (data != nil) {
  [textView breakUndoCoalescing];
 }

 return data;
}

1 Ответ

1 голос
/ 17 декабря 2010

NSDocument не заботится о завершении строки;это полуабстрактный класс, предназначенный для подкласса.Само по себе это ничего не накладывает на формат файла.

Это особая реализация подкласса NSDocument, который читает и пишет простой текст, который будет заботиться о символах окончания строки.

...