1

(这个问题已经从一个问题中重写,并进行了NSTextView一些进一步的研究)

更新:您可以下载一个非常基本的项目,在此处显示问题:

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

grep -c "\r" file.txt对您保存的文件执行 a 以获得\r发生的行数......重复 for \n)。

我已经意识到NSDocumenthave创建的所有文件\r都是行结尾,而不是标准\n,即使NSData我的文档子类返回不包含\r,它只包含\n. 有没有办法配置这个?

这些天我认为 Mac 使用 UNIX 行结尾,所以 AppKit 仍然使用过时的 Mac 结尾似乎很奇怪。更奇怪的是,它NSDocument要求,然后通过改变行尾来NSData相当不友好地破坏它。NSData

切换到\r是在 producer之后发生的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;
}
4

1 回答 1

1

NSDocument 不关心行终止;它是一个半抽象类,旨在被子类化。它本身对文件格式没有任何影响。

它是 NSDocument 子类的特定实现 - 碰巧读写纯文本的子类 - 将关心行终止字符。

于 2010-12-17T04:02:10.110 回答